2017-10-09 68 views
1

我在Spring中使用傑克遜將我的類序列化爲JSON。當我像下面的例子一樣序列化一個類時,Jackson將某些字段的名稱從Camel Case更改爲小寫字母。我知道我可以通過創建自定義(de)序列化器來解決此問題,但我希望能夠在全局範圍內關閉此功能。也許通過在application.properties中設置一個屬性。停止傑克遜從變化的名稱變量名稱

default Jackson naming strategy,這是不應該發生的:

在沒有註冊的自定義策略,默認的Java屬性命名策略被使用,這讓字段名是...

class Foo { 
    private final String firstName; 
    private final String aName; 
    private final String name; 
    private final String abName; 

    Foo(final String firstName, final String aName, final String name, final String abName) { 
     this.firstName = firstName; 
     this.aName = aName; 
     this.name = name; 
     this.abName = abName; 
    } 
    // Getters here 
} 

public static void main(String[] args) { 
     final ObjectMapper mapper = new ObjectMapper(); 
     final Foo foo = new Foo("first", "a", "name", "ab"); 
     final String jsonInString = mapper.writeValueAsString(foo); 
     System.out.println(jsonInString); 
} 

預計:

{ 「名字」: 「第一」, 「名」:「南E 「 」abName「: 」AB「,」 aName 「:」 一個 「}

實際:

{」 名字 「:」 第一」, 「名稱」: 「姓名」, 「abName」: 「AB」, 「aname 」:「 一」}

編輯:

縮小問題下到干將解釋。開始在傑克遜看起來像一個bug。

class Foo { 
    private final String aName; 

    Foo(final String aName) { 
     this.aName = aName; 
    } 

    public String getaName() { 
     return this.aName; 
    } 
} 

序列化爲{"aName":"a"}

然而,

class Foo { 
    private final String aName; 

    Foo(final String aName) { 
     this.aName = aName; 
    } 

    public String getAName() { 
     return this.aName; 
    } 
} 

序列化爲{"aname":"a"}

+0

使用'@JsonProperty( 「AName」)'你就完成了 – Optional

回答

4

這裏的問題更多的是關於JavaBeans(TM) Specification。根據規範(第58頁)

但是支持偶爾使用全大寫的名字,我們 檢查,如果前兩個字符的名稱都是大寫和 如果是離開它單獨

「fooBah」變成「fooBah」

「Z」變爲「Z」

「URL」變成「URL」

而且您有一個aName字段的邊緣案例。因爲如果吸氣劑看起來像AName(),那麼當你從這個吸氣劑轉回來時,你應該根據規範尋找AName字段。這是額外的信息explanation

因此,要解決這個問題,你可以使用適當的吸氣劑(getaName())或@JsonProperty("aName")註釋以上場/吸氣

這裏是similar question

2

雖然我不知道爲什麼傑克遜讀取getANameaname,有可能迫使傑克遜與@JsonProperty("AName")使用某個名稱。例如:(得到了this密切相關的問題,這種解決方案)

class Foo { 
    private final String aName; 

    Foo(final String aName) { 
     this.aName = aName; 
    } 

    @JsonProperty("AName") 
    public String getAName() { 
     return this.aName; 
    } 
}