jackson 轉 json時,字段名大小寫問題


現象:

 

分析:

從圖中,我們可以看到 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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM