解决jackson序列化pojo类出现大小写问题

现象:

    公司的一个springboot项目,由于pojo类的字段都是全大写的,刚开始开发的时候在每个字段上添加了jackson的@JsonProperty(value=”USERID”)注解,用来控制返回json为全大写字段。在项目开发过程中发现了lombok工具可以减少getter/setter的代码,便引入进了项目中,删除了所有pojo的getter/setter方法。后来经前端发现,在部分API接口返回的json中同时包含了大写和小写的pojo字段各一遍。

解决:

    发现问题之后,一度以为是lombok导致的。后来经查询jackson的原因导致的,jakson把JsonProperty放到字段名上的时候,需要在getter方法上写上JsonIgnore注解,但是由于getter方法是lombok自动生成的,重新手动插入太浪费时间,于是切换了fastjson作为json序列化的工具。

顺便记录一下切换步骤:

引入fastjson包

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>

启动类中重写转换方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 /**
* 切换json解析方式,用fastjson代替默认jackson方式
* @return
*/
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
//1、定义一个消息转换对象conver
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、添加fastjson配置信息
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//3、判断propertyName长度大于1、且头两个字符都是大写时,不做小写转换
TypeUtils.compatibleWithJavaBean=true;

fastConverter.setFastJsonConfig(fastJsonConfig);

return new HttpMessageConverters(fastConverter);
}

jackson序列化出现两遍的原因

    经查询得知,jackson2在初始化序列器时,对pojo类型对象会先收集其属性信息,包括成员变量和方法,然后以属性名称和处理过后的方法名称作为key保存到一个LinkedHashMap中。收集过程中会调用com.fasterxml.jackson.databind.util.BeanUtil中的legacyMangleProperName方法来处理方法名称,它会将get/set方法前缀,即get或set去掉,并将其后面的连续大写字符转换成小写返回。收集完属性信息之后,下面会删除掉非可见的属性,一般是指的私有成员变量;但,如果加了@JsonProperty注解,Jackson2会认为这个属性是可见的,不会进行删除,此时就会出现两个同一个值得属性被一同序列化。