Джексон JSON Deserialization с корневым элементом

У меня есть вопрос с Джексоном, который, я думаю, должен быть прост для решения, но он убивает меня.

Скажем, у меня есть класс POJO Java, который выглядит так (предположим, что Getters и Setters для меня):

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

И я хочу десериализовать JSON, который похож на объект User:

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

Джексон дает мне проблемы, потому что Пользователь не является объектом первого уровня в JSON. Я мог бы, очевидно, создать класс UserWrapper, который имеет единственный объект User, а затем десериализовать его, но я знаю, что должно быть более элегантное решение.

Как мне это сделать?

Ответ 1

edit: это решение работает только для jackson < 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]