一尘不染

带有根元素的Jackson JSON反序列化

json

我和Jackson有一个问题,我认为应该很容易解决,但是这真使我丧命。

假设我有一个看起来像这样的Java POJO类(假设对我来说是Getters和Setters):

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

我想将看起来像这样的JSON反序列化为User对象:

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

杰克逊给了我一些问题,因为用户不是JSON中的第一级对象。我显然可以制作一个具有单个User对象的UserWrapper类,然后使用该对象反序列化,但是我知道必须有一个更优雅的解决方案。

我应该怎么做?


阅读 312

收藏
2020-07-27

共1个答案

一尘不染

编辑:此解决方案仅适用于杰克逊 <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]
2020-07-27