2016-12-05 3 views
0

Sagen wir, ich habe eine Elternteil-Kind-Beziehung. Meine Eltern json sieht aus wieKann Jackson Zwischenbeziehungen behandeln

{ 
    childrens: [...] 
} 

Sagen wir, das Modell ich will (de) Serialisierung zu/von einem Zwischenkörper zwischen dem Elternteil und Kinder hat.

class Parent { 
    Intermediate intermediate 
} 

class Intermediate { 
    Child[] children; 
} 

Kann ich konfigurieren Jackson, dass die Zwischen Objekt zu erstellen, wenn die json in das Modell Deserialisieren, und in ähnlicher Weise die Zwischen Objekt überspringen, wenn wieder auf Json Serialisierung?

+0

ich dies ohne das Schreiben eines [custom getan werden kann nicht glauben Deserializer] (http://www.baeldung.com/jackson-deserialization) (und Serializer) für Parent. – rmlan

+0

@rml Wenn das Modell in meiner Frage wirklich in der Mitte eines viel größeren Modellbaums war, müsste der benutzerdefinierte Deserializer mit allem anderen in diesem Modellbaum fertig werden? Oder kann ich es begrenzen, also muss ich nur benutzerdefinierten Code um Parent/Intermediate/Child schreiben? – hvgotcodes

+0

Sie sollten die @ JsonDeserialize (using = CustomDeserializer.class) (und @ JsonSerialize) Annotationen für das Feld selbst verwenden können, ohne das gesamte Objekt zu behandeln. [Siehe diese Frage] (http://stackoverflow.com/questions/5269637/custom-deserialization-of-json-field-with-jackson-in-java) – rmlan

Antwort

1

Sie können die @JsonUnwrapped Annotation für diesen Fall verwenden. Hier ist ein Beispiel mit einer ähnlichen Struktur zu Ihrem Beitrag

Parent.java

import com.fasterxml.jackson.annotation.JsonUnwrapped; 

public class Parent { 

    @JsonUnwrapped 
    private Intermediate intermediate; 

    public Intermediate getIntermediate() { 
     return intermediate; 
    } 

    public void setIntermediate(Intermediate intermediate) { 
     this.intermediate = intermediate; 
    } 
} 

Intermediate.java

public class Intermediate { 
    private Child[] children; 

    public Child[] getChildren() { 
     return children; 
    } 

    public void setChildren(Child[] children) { 
     this.children = children; 
    } 
} 

Child.java

public class Child { 
    private String name; 
    private Integer age; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Integer getAge() { 
     return age; 
    } 

    public void setAge(Integer age) { 
     this.age = age; 
    } 
} 

Beispiel Dokument

{ 
    "children": [ 
    { 
     "name": "Foo", 
     "age": 20 
    }, 
    { 
     "name": "Bar", 
     "age": 22 
    } 
    ] 
} 

Testfahrer

ObjectMapper mapper = new ObjectMapper(); 
Parent parent = mapper.readValue(json, Parent.class); 

for (Child child : parent.getIntermediate().getChildren()) { 
    System.out.println("Child: " + child.getName() + " is " + child.getAge() + " years old."); 
} 

, die die folgende Ausgabe erzeugt:

Child: Foo is 20 years old. 
Child: Bar is 22 years old. 
Verwandte Themen