web-dev-qa-db-fra.com

Désérialisation Jackson JSON avec élément racine

J'ai une question avec Jackson qui, à mon avis, devrait être simple à résoudre, mais elle me tue.

Disons que j'ai un Java classe POJO qui ressemble à ceci (supposons que les Getters et Setters pour moi):

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

Et je veux désérialiser JSON qui ressemble à ceci dans un objet utilisateur:

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

Jackson me donne des problèmes parce que l'utilisateur n'est pas l'objet de premier niveau dans le JSON. Je pourrais évidemment créer une classe UserWrapper qui a un seul objet User, puis désérialiser en utilisant cela, mais je sais qu'il doit y avoir une solution plus élégante.

Comment dois-je procéder?

40
Sam Stern

modifier: cette solution ne fonctionne que pour jackson <2.

Pour votre cas, il existe une solution simple:

  • Vous devez annoter votre classe de modèle avec @JsonRootName(value = "user");
  • Vous devez configurer votre mappeur avec om.configure(Feature.UNWRAP_ROOT_VALUE, true); (comme pour 1.9) et om.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); (pour la version 2).

C'est ça!


@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));

cela imprimera:

User [name=Sam Smith, age=1]
63
Francisco Spaeth