web-dev-qa-db-de.com

Was ist die Deserialisierung von Jackson von @JsonUnwrapped?

Angenommen, ich habe folgende Klasse:

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

Produktion von JSON:

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

Wie deserialisiere ich dies zurück in die Parent-Klasse? Ich könnte @JsonCreator verwenden

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

Dies fügt jedoch auch @JsonIgnoreProperties(ignoreUnknown=true) effektiv zur Parent-Klasse hinzu, da alle Eigenschaften hier zugeordnet sind. Wenn also unbekannte JSON-Felder eine Ausnahme auslösen sollen, müssen Sie dies selbst tun. Wenn die Kartenwerte jedoch etwas anderes als Strings sein könnten, müssten Sie die Typprüfung und -konvertierung manuell durchführen. Gibt es eine Möglichkeit für Jackson, diesen Fall automatisch zu erledigen?

Edit: Ich bin vielleicht verrückt, aber das scheint tatsächlich zu funktionieren, obwohl es in der Dokumentation nie ausdrücklich erwähnt wurde: http://fasterxml.github.io/jackson-annotations/javadoc/2.2.0 /com/fasterxml/jackson/annotation/JsonUnwrapped.html
Ich war mir ziemlich sicher, dass es bei mir vorher nicht funktioniert hat. Der vorgeschlagene @JsonCreator-Ansatz kann jedoch bevorzugt werden, wenn eine benutzerdefinierte Logik erforderlich ist, um nicht umwickelte polymorphe Typen zu deserialisieren.

35
Shaun

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

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

In diesem Fall führt Jackson die Typprüfung und die Überprüfung unbekannter Felder durch.

28
hoaz

Es funktioniert auch für die Deserialisierung, obwohl es in den Dokumenten nicht explizit erwähnt wird, wie Sie sagten. Siehe den Komponententest zur Deserialisierung von @JsonUnwrapped hier zur Bestätigung - https://github.com/FasterXML/jackson-databind/blob/d2c083a6220f2875c97c29f4823d9818972511dc/src/test/Java/com/fasterxml/jackson/databind/struct/TestUnwrapped.Java#L138

6
spinlok

Für diejenigen, die wie ich hier googelten und versuchten, das Problem bei der Deserialisierung von unwrapepd Map zu lösen, gibt es eine Lösung mit @JsonAnySetter:

public class CountryList
{

    Map<String, Country> countries = new HashMap<>();

    @JsonAnySetter
    public void setCountry(String key, Country value)
    {
        countries.put(key, value);
    }

}
0
Jan Mares