2012-07-28 28 views
35

Ho una domanda con Jackson che penso debba essere semplice da risolvere, ma mi sta uccidendo.Deserializzazione Jackson JSON con Elemento di radice

Diciamo che ho una classe POJO Java che assomiglia a questo (assumere getter e setter per me):

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

e voglio deserializzare JSON che assomiglia a questo in un oggetto d'uso:

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

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

Come devo fare?

risposta

53

edit: questa soluzione funziona solo per Jackson < 2,0

Per il vostro caso c'è una soluzione semplice:

  • È necessario annotare la classe modello con @JsonRootName(value = "user");
  • È necessario configurare il 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 stampa:

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

Grazie! Sapevo che doveva esserci un'annotazione che non riuscivo a far apparire con il mio Google-Fu. –

+1

siete i benvenuti! ;) –

+3

Per chiunque visiti questa pagina in futuro, vorrei sottolineare che funziona solo con Jackson <2.0 (quando era Codehaus, prima che fosse migrato su FasterXML). Non riesco a trovare UNWRAP_ROOT_VALUE nel pacchetto FasterXML. –

Problemi correlati