2013-05-15 11 views
32

sagen, dass ich die folgende Klasse haben:Was ist das Jackson-Deserialisierungsäquivalent von @JsonUnwrapped?

public class Parent { 
    public int age; 
    @JsonUnwrapped 
    public Name name; 
} 

Producing JSON:

{ 
    "age" : 18, 
    "first" : "Joey", 
    "last" : "Sixpack" 
} 

Wie Deserialisieren ich diese wieder in die übergeordnete Klasse? Ich konnte @JsonCreator verwenden

@JsonCreator 
public Parent(Map<String,String> jsonMap) { 
    age = jsonMap.get("age"); 
    name = new Name(jsonMap.get("first"), jsonMap.get("last")); 
} 

Aber das fügt auch effektiv @JsonIgnoreProperties(ignoreUnknown=true) zu der übergeordneten Klasse, da alle Eigenschaften hier abzubilden. Wenn Sie also möchten, dass unbekannte JSON-Felder eine Ausnahme auslösen, müssen Sie dies selbst tun. Wenn die Kartenwerte auch etwas anderes als Strings sein könnten, müssten Sie eine manuelle Typüberprüfung und -konvertierung durchführen. Gibt es eine Möglichkeit für Jackson, diesen Fall automatisch zu behandeln?

Edit: Ich könnte verrückt sein, aber dies scheint tatsächlich trotz nie in der Dokumentation explizit erwähnt wird zu funktionieren: http://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html
Ich war ziemlich sicher, dass es vorher nicht für mich arbeiten. Dennoch ist der vorgeschlagene @ JsonCreator-Ansatz möglicherweise vorzuziehen, wenn benutzerdefinierte Logik zum Entserialisieren von unwrapped polymorphen Typen benötigt wird.

+2

Sind Sie sicher, dass '@ JsonUnwrapped' für die Deserialisierung funktioniert? Ich habe es gerade ausprobiert und bekomme 'Fehler beim Lesen von JSON: Unbekanntes Feld ...', wenn ich versuche, das abgeflachte JSON zu deserialisieren. –

Antwort

26

können Sie verwenden @JsonCreator mit @JsonProperty für jedes Feld:

@JsonCreator 
public Parent(@JsonProperty("age") Integer age, @JsonProperty("firstName") String firstName, 
     @JsonProperty("lastName") String lastName) { 
    this.age = age; 
    this.name = new Name(firstName, lastName); 
} 

Jackson für Sie nicht Typprüfung und unbekanntes Feld in diesem Fall zu prüfen.

+1

Guter Punkt. Dies beantwortet die Frage, wie man in JsonCreators generell die jackson type/field checking behalten kann, was vielleicht die einzige nützliche Frage bleibt. =) – Shaun