2012-07-28 33 views
35

Tengo una pregunta con Jackson que creo que debería ser fácil de resolver, pero me está matando.Deserialización de Jackson JSON con Root Element

Digamos que tengo una clase POJO java que tiene este aspecto (se supone captadores y definidores para mí):

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

y quiero deserializar JSON que se ve así en un objeto de 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 debo hacer esto?

Respuesta

53

edición: esta solución sólo funciona para Jackson < 2,0

Para su caso no es una solución simple:

  • necesita anotar la clase del 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 todo!


@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 imprimirá:

User [name=Sam Smith, age=1] 
+0

Gracias! Sabía que tenía que haber una anotación. Simplemente no podía mostrarla con mi Google-Fu. –

+1

¡Bienvenido! ;) –

+3

Para cualquiera que acceda a esta página en el futuro, me gustaría señalar que esto solo funciona con Jackson <2.0 (cuando era Codehaus, antes de migrar a FasterXML). No puedo encontrar UNWRAP_ROOT_VALUE en el paquete FasterXML. –

Cuestiones relacionadas