2012-09-14 70 views
20

我認爲我需要創建專家ObjectMapper,並且找不到任何示例代碼來啓動該過程。使用ObjectMapper更改字段大小寫

JSON的創建者正在使用.Netpublic屬性,因此使用帶有大寫字母的字段名稱。我將JSON解析爲POJO,所以我想使用小寫字母。

在其末端:

public class Facet 
    { 
     public string Name { get; set; } 
     public string Value { get; set; } 
    } 

在我的結束,因此我必須具備:

public class Facet { 
     public String Name; 
     public String Value; 
    } 

我更希望:

public class Facet { 
     public String name; 
     public String value; 
    } 

我是正確的,可以這樣做與ObjectMapper

+1

我已經改名並去除問題的第二部分。另一半是張貼[這裏](http://stackoverflow.com/q/12450404/823393) – OldCurmudgeon

回答

23

你的第一個問題可以用@JsonProperty註解非常簡單處理:

// java-side class 
public class Facet 
{ 
    @JsonProperty("Name") 
    public String name; 

    @JsonProperty("Value") 
    public String value; 
} 

現在ObjectMapper將匹配了不同的外裝的字段名。如果你不想添加註解到您的類,你可以爲你Facet創建一個混合類來立場在

public class FacetMixIn 
{ 
    @JsonProperty("Name") 
    public String name; 

    @JsonProperty("Value") 
    public String value; 
} 

objectMapper.getDeserializationConfig().addMixInAnnotations(Facet.class, FacetMixIn.class); 

這樣就實現了同樣的事情,而不需要額外的註解Facet班。

+0

這正是我在第1部分尋找:)謝謝。我已經添加到第2部分。這是否更容易? – OldCurmudgeon

+0

我已經把原來的問題分爲兩部分,所以這是一個完整的答案。通過一切手段修改以反映問題的變化。 – OldCurmudgeon

14

Jackson可以配置爲使用內置或自定義PropertyNamingStrategy來註釋每個字段,以便在Java屬性/字段名稱和JSON元素名稱之間應用一致的轉換。

例如:

myObjectMapper.setPropertyNamingStrategy(PascalCaseStrategy); 
+0

感謝@ProgrammerBruce爲您提供進一步的幫助。當我在新的一年晚些時候回到工作崗位時,我會檢查這些作品。順便說一句 - 有沒有一種策略可以匹配任何情況?如果不是,也許你可以發佈一個。我正試圖與一位可以隨時更改約定的客戶打交道。 – OldCurmudgeon

+0

最後我看了(大約一年前),名稱轉換隻能沿着一個方向進行(從Java屬性/字段名稱到JSON元素名稱,反之亦然),因此實施不區分大小寫的匹配並不像否則可能是。 –

+0

@Jose:他們是不同的東西。 SnakeCaseStrategy的確是「snake_case_variables」 – dagnelies

5

這個問題可以從Jackson 2.5.0來解決這樣的:

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); 

根據JavaDoc:

com.fasterxml.jackson.databind.MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES

功能將允許更多原諒傳入的反序列化 JSON。如果啓用,bean屬性將使用它們的 小寫等價物進行匹配,這意味着任何個案組合(傳入的 和匹配的名稱都被下層框架規範化)應該可以工作。

請注意,由於在比較之前傳入的 屬性名稱需要小寫,所以對於大寫字母爲 的情況,會有額外的性能開銷。對於 已經小寫的名稱的開銷應該可以忽略不計。

默認情況下禁用功能。

時間: 2.5