2012-07-28 19 views
35

Ich habe eine Frage mit Jackson, die ich denke, sollte einfach zu lösen sein, aber es bringt mich um.Jackson JSON Deserialisierung mit Root Element

Lassen Sie uns sagen, dass ich eine Java-POJO Klasse, die wie folgt aussieht (nehmen Getter und Setter für mich):

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

Und ich will JSON deserialisieren, die wie folgt in ein User-Objekt sieht:

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

Jackson gibt mir Probleme, weil der Benutzer nicht das Objekt der ersten Ebene in der JSON ist. Ich könnte natürlich eine UserWrapper-Klasse erstellen, die ein einzelnes User-Objekt hat und dann mit dem Deserialisieren, aber ich weiß, dass es eine elegantere Lösung geben muss.

Wie soll ich das tun?

Antwort

53

edit: Diese Lösung funktioniert nur für jackson < 2,0

Für Ihren Fall gibt es eine einfache Lösung:

  • Sie benötigen eine Modellklasse mit @JsonRootName(value = "user") zu annotieren;
  • Sie müssen Ihren Mapper mit om.configure(Feature.UNWRAP_ROOT_VALUE, true); (wie für 1.9) und (für Version 2) konfigurieren.

Das war's!


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

dies drucken:

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

Thank you! Ich wusste, dass es eine Anmerkung geben musste, ich konnte es einfach nicht mit meinem Google-Fu sehen. –

+1

Sie sind herzlich willkommen! ;) –

+3

Für jeden, der in Zukunft auf diese Seite kommt, möchte ich darauf hinweisen, dass dies nur mit Jackson <2.0 funktioniert (als es CodeHaus war, bevor es zu FasterXML migriert wurde). Ich kann UNWRAP_ROOT_VALUE im FasterXML-Paket nicht finden. –

Verwandte Themen