掉坑的日常:springboot的json属性名大小写问题
掉坑的日常:springboot的json属性名大小写问题

这两天想给自己小组的项目添加一个自动升级功能。这事听着复杂,但毕竟是个很常见的功能,github上的轮子很多。经过考虑,我决定选择这个组件,然后自己写后端。反正后端就返回一个json的事。然后就掉了坑。

起因

案发现场没什么好说的,就是我发现自己设置的不能实现升级,在客户端调试半天发现用官方的json能升级。然后我就找我的json和官方的json有什么区别,看ContentType也没设置错,仔细比对发现属性大小写竟然不对。我当时还挺惊讶的,毕竟是直接复制的。

springboot可以使用@ResponseBody返回对象自动转换json,而转换成的json属性名首字母会被转换成小写。

解决方案

引入fastjson

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.66</version>
		</dependency>

注入bean

    @Bean
    public HttpMessageConverters httpMessageConverters() {
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter(); // 添加fastJson的配置信息
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); // 处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON); // 在convert中添加配置信息.
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
        return new HttpMessageConverters(converter);
    }

在属性上加注解

package edu.upc.mishuserver.vo;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * UpdateInfo
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UpdateInfo {
    @JSONField(name="Code")
    private Long code;
    @JSONField(name = "Msg")
    private String msg;
    @JSONField(name = "UpdateStatus")
    private Integer updateStatus;
    @JSONField(name = "VersionCode")
    private Long versionCode;
    @JSONField(name = "VersionName")
    private String versionName;
    @JSONField(name = "ModifyContent")
    private String modifyContent;
    @JSONField(name = "DownloadUrl")
    private String downloadUrl;
    @JSONField(name = "ApkSize")
    private Long apkSize;
    @JSONField(name = "ApkMd5")
    private String apkMd5;
}

最后修改于 2020-03-24