现象:
分析:
从图中,我们可以看到 A1这个字段在Json中出现了2次。
这种问题出现在一种情况下,当字段的首字母是大写,而且加上的@JsonProperty的值得首字母也是大写的时候。
什么原因呢?
jackson默认的字段属性发现规则如下:
所有被public修饰的字段->所有被public修饰的getter->所有被public修饰的setter。
字段都是private的,所以无法识别。
而 getter识别的时候无法却分首字母是大写还是小写,
所以jackson统一用java的规范假设成小写,所以会出现"a1"。
而@JsonProperty又指定了需要转换一个首字母大写的"A1",所以jackson又转出一个"A1"。
解决:
在转换的类的上面加上注解:
@JsonAutoDetect(fieldVisibility= JsonAutoDetect.Visibility.ANY,getterVisibility= JsonAutoDetect.Visibility.NONE)
意思是 对于所有修饰的field都进行识别,即 private,public,protected都会被识别。
对所有的getter方法都不进行识别,所以就不会识别出小写的"a1"。
照道理还需要加上setterVisibility的设置,不过经过测试,貌似不需要。
该问题还有一种体现, @JsonIgnore 注解失效。
@Getter
@Setter
@Accessors(chain = true)
public static class TestPO{
@JsonIgnore
private String aaa; //全部小写
@JsonIgnore
private String Bbb; //第一个字母大写
@JsonIgnore
private String DDd; //前两个字母大写(其实,以大写字母开头的任意字符串都会是这种情况)
@JsonIgnore
private String eEe; //第一个小写 第二个大写
@JsonIgnore
private String ffFff; //前两个字母小写
}
上面这个POJO转换成Json后,打印出:
{"bbb":"2","ddd":"3","eee":"4"}
原因就是大写字母在get方法上让jackson识别出了错误。中间标红的三种大写字母都让识别出错。
解决办法有两种:
第一个办法是,字段名尽量避免中间标红的三种方式。
第二个办法是,在POJO类上加上注解:
@JsonAutoDetect(fieldVisibility= JsonAutoDetect.Visibility.ANY,getterVisibility= JsonAutoDetect.Visibility.NONE)