用jackson的@JsonProperty注解属性名多出一个字段问题解决方案

一、问题

今天在用jackson的@JsonProperty注解属性名时,发现输出结果里面多了一个字段。

二、原因

Jackson2在初始化序列器时,首先,对pojo类型对象会收集其属性信息,属性包括成员变量及方法;然后,将属性名称和处理过后的方法名称作为key,保存到一个LinkedHashMap中。在对pojo类型对象收集的过程中,Jackson2会调用com.fasterxml.jackson.databind.util.BeanUtil中的legacyManglePropertyName方法来处理方法名称,它会把get/set方法前缀(即get或set)去掉,把“其后面的连续大写字符”转换成“小写字符”,将处理后的结果返回。

例如: getNEWString会转变成newstring返回。如果你的属性名称为"nSmallSellCount",lombok自动生成的get方法是"getNSmallSellCount";legacyManglePropertyName方法处理过后,就是"nsmallSellCount",这与属性nSmallSellCount并不冲突,可以同时存在于HashMap中。Jackson2收集完属性信息后,在下面的步骤中,会删除掉非可见的属性,一般指的是私有成员变量,这时,名称为"nSmallSellCount"的成员变量属性会被删除掉,序列化结果是不会有问题的。但是,如果加了@JsonProperty注解,Jackson2会认为这个属性是可见的,不会删除。这时,这两个表示同一个值的属性就会被一同序列化。

三、解决方案

去除lombok的@Data注解,手动编写get和set方法,@JsonProperty注解加到get方法上。

四、知识点梳理

1.jackson默认序列化时,只处理有get和set方法的字段,私有字段是不参与序列化的。
2.@JsonProperty 指定序列化的名称。注解在私有属性上时,标明该私有字段在序列化时可见。
3.@JsonProperty 如果标注在get或set方法上,就不会有问题。
4.项目中使用了lombok的@Data注解,@JsonProperty标注在私有属性上,没有手动编写get和set方法,这就导致了出问题。

猜你喜欢

转载自blog.csdn.net/chinawangfei/article/details/121662813