現象:
分析:
從圖中,我們可以看到 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)