现象:

b7863076e04a06b50f90d27b660cd320.png

4fcac740c07e06ce1263385b9b14817c.png

分析:

从图中,我们可以看到 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 classTestPO{

@JsonIgnoreprivateString aaa;      //全部小写

@JsonIgnoreprivateString Bbb;      //第一个字母大写

@JsonIgnoreprivateString DDd;      //前两个字母大写(其实,以大写字母开头的任意字符串都会是这种情况)

@JsonIgnoreprivateString eEe;      //第一个小写 第二个大写

@JsonIgnoreprivateString ffFff;     //前两个字母小写

}

上面这个POJO转换成Json后,打印出:

{"bbb":"2","ddd":"3","eee":"4"}

原因就是大写字母在get方法上让jackson识别出了错误。中间标红的三种大写字母都让识别出错。

解决办法有两种:

第一个办法是,字段名尽量避免中间标红的三种方式。

第二个办法是,在POJO类上加上注解:

@JsonAutoDetect(fieldVisibility= JsonAutoDetect.Visibility.ANY,getterVisibility= JsonAutoDetect.Visibility.NONE)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐