stddeserializer jsondeserialize deserializer deserialize custom java json jackson pojo

java - jsondeserialize - Deserialización Jackson JSON con elemento raíz



spring deserialize json (1)

Tengo una pregunta con Jackson que creo que debería ser simple de resolver, pero me está matando.

Digamos que tengo una clase java POJO que se ve así (supongo que Getters y Setters para mí):

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

Y quiero deserializar JSON que se parece a esto en un objeto Usuario:

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

Jackson me está dando problemas porque el usuario no es el objeto de primer nivel en el JSON. Obviamente podría hacer una clase UserWrapper que tenga un solo objeto User y luego deserializar usando eso, pero sé que debe haber una solución más elegante.

¿Cómo debería hacer esto?


editar: esta solución solo funciona para jackson <2.0

Para su caso, hay una solución simple:

  • @JsonRootName(value = "user") anotar su clase de modelo con @JsonRootName(value = "user") ;
  • Necesita configurar su asignador con om.configure(Feature.UNWRAP_ROOT_VALUE, true); (como para 1.9) y om.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); (para la versión 2).

¡Eso es!

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

esto se imprimirá:

User [name=Sam Smith, age=1]