Deserializzazione di Jackson JSON con Root Element

Sto facendo una domanda con Jackson che penso debba essere semplice da risolvere, ma mi sta uccidendo.

Diciamo che ho una class POJO java simile a questa (assumete Getters and Setters per me):

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

E voglio deserializzare JSON che assomiglia a questo in un object User:

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

Jackson mi sta dando problemi perché l’utente non è l’object di primo livello nel JSON. Ovviamente potrei creare una class UserWrapper che abbia un singolo object User e quindi deserializzare usando quella, ma so che ci deve essere una soluzione più elegante.

Come dovrei farlo?

modifica: questa soluzione funziona solo per jackson <2.0

Per il tuo caso c’è una soluzione semplice:

  • È necessario annotare la class del modello con @JsonRootName(value = "user") ;
  • Devi configurare il tuo mapper con om.configure(Feature.UNWRAP_ROOT_VALUE, true); (come per 1.9) e om.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); (per la versione 2).

Questo è tutto!


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

questo stamperà:

 User [name=Sam Smith, age=1]