2012-07-28 64 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