2012-07-28 52 views
35

我對傑克遜有一個問題,我認爲應該很容易解決,但它會殺死我。傑克遜JSON與根元素的反序列化

比方說,我有一個Java POJO類,它看起來像這樣(假設getter和setter對我來說):

class User { 
    private String name; 
    private Integer age; 
} 

而且我想反序列化JSON看起來像這樣爲用戶對象:

{ 
    "user": 
    { 
     "name":"Sam Smith", 
     "age":1 
    } 
} 

傑克遜給我的問題,因爲用戶不是JSON中的第一級對象。我顯然可以創建一個具有單個User對象的UserWrapper類,然後使用該對象進行反序列化,但我知道必須有一個更優雅的解決方案。

我該怎麼做?

回答

53

編輯:此解決方案僅適用於傑克遜< 2.0

對於您的情況下,有一個簡單的解決方案:

  • 您需要@JsonRootName(value = "user")註釋模型類;
  • 您需要使用om.configure(Feature.UNWRAP_ROOT_VALUE, true);(對於1.9)和om.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);(對於版本2)配置您的映射器。

就是這樣!


@JsonRootName(value = "user") 
public static class User { 
    private String name; 
    private Integer age; 

    public String getName() { 
     return name; 
    } 

    public void setName(final String name) { 
     this.name = name; 
    } 

    public Integer getAge() { 
     return age; 
    } 

    public void setAge(final Integer age) { 
     this.age = age; 
    } 

    @Override 
    public String toString() { 
     return "User [name=" + name + ", age=" + age + "]"; 
    } 

} 

ObjectMapper om = new ObjectMapper(); 
om.configure(Feature.UNWRAP_ROOT_VALUE, true); 
System.out.println(om.readValue("{ \"user\": {  \"name\":\"Sam Smith\",  \"age\":1 }}", User.class)); 

會打印:

User [name=Sam Smith, age=1] 
+0

謝謝!我知道必須有一個註釋,我無法讓它出現在我的Google-Fu中。 – 2012-07-28 20:34:39

+1

歡迎您! ;) – 2012-07-28 20:35:26

+3

對於任何未來來到這個頁面的人,我想指出的是,這隻適用於傑克遜<2.0(當它是Codehaus,在它被遷移到FasterXML之前)。我在FasterXML包中找不到UNWRAP_ROOT_VALUE。 – 2012-07-29 21:54:45