2016-12-11 11 views
3

JSONDeserialize mit Jackson mit Bezug auf ein vorhandenes Objekt

{ 
    "schools": [ 
    { 
     "id": 1, 
     "name": "School A" 
    }, 
    { 
     "id": 2, 
     "name": "School B" 
    } 
    ], 
    "students": [ 
    { 
     "id": 1, 
     "name": "Bobby", 
     "school": 1 
    } 
    ] 

} 

Wie würde ich ordnen Sie die JSON in die folgenden Klassen, so dass Bobbys Schule in die bereits instanziiert Schule A. abgebildet wird

public class School { 
    private Integer id; 
    private String name; 
} 

public class Student { 
    private Integer id; 
    private String name; 
    private School school; 
} 

Ich habe einige seltsame Sachen mit der Studentenklasse ausprobiert ...

public class Student { 
    private Integer id; 
    private String name; 
    private School school; 

    @JsonProperty("school") 
    public void setSchool(Integer sid) { 
    for (School school : getSchools()) { 
     if (school.id == sid) { 
     this.school = school; 
     break; 
     } 
    } 
    } 
} 

Das Problem, das ich hav Es ist so, dass sowohl die Schulen als auch die Schüler von der JSON zur gleichen Zeit analysiert werden, also weiß ich nicht, wie ich eine Liste der Schulen bekommen soll. Vielleicht sollte ich diese separat analysieren, also habe ich zuerst die Liste der Schulen?

+0

Haben Sie etwas versucht? Es ist nicht klar, an was du feststeckst. – 4castle

+0

Tut mir leid, ich habe versucht, das Problem, das ich versuche zu lösen, mit einem Beispiel für einen der Ansätze, die ich versucht habe, besser zu erklären. – Rawr

Antwort

1

Jackson wird es für Sie tun. Notieren Sie einfach Ihre Objekte mit @JsonIdentityInfo:

@JsonIdentityInfo(scope=School.class, generator=ObjectIdGenerators.PropertyGenerator.class, property="id") 
public class School { 
    private Integer id; 
    private String name; 

    public School() { 
    } 

    public School(Integer id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

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

@JsonIdentityInfo(scope=Student.class, generator=ObjectIdGenerators.PropertyGenerator.class, property="id") 
public class Student { 
    private Integer id; 
    private String name; 
    private School school; 

    public Student() { 
    } 

    public Student(Integer id, String name, School school) { 
     this.id = id; 
     this.name = name; 
     this.school = school; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public School getSchool() { 
     return school; 
    } 

    public void setSchool(School school) { 
     this.school = school; 
    } 
} 

public static void main(String[] args) throws IOException { 
    School school = new School(1, "St Magdalene's"); 
    Student mary = new Student(1, "Mary", school); 
    Student bob = new Student(2, "Bob", school); 
    Student[] students = new Student[] {mary, bob}; 

    // Write out 
    String serialized = mapper.writeValueAsString(students); 
    System.out.println("Serialized: " + serialized); 
    // Read in 
    Student[] deserialized = mapper.readValue(serialized, Student[].class); 
} 
+0

Hat nicht funktioniert. Serialisiert sieht es so aus: '{{" id ": 1," name ":" Mary "," schule ": {" id ": 1," name ":" St. Magdalenas "}}, {" id ": 2, "Name": "Bob", "Schule": 1}] ' Deserialisiert verbindet es nicht mit dem Schulobjekt, sondern speichert nur die ID der Schule. – Rawr

+0

Entschuldigung, ich hätte das Ergebnis überprüfen sollen. Ohne Typinfo erfolgte die Deserialisierung zu einer Liste von Hash-Sets. Ich habe das Beispiel aktualisiert, um einen Schüler [] zu verwenden, damit Jackson genug Informationen hat, um die Objekte zu bauen. – teppic

+0

Als Alternative können Sie Jackson die IDs verwalten lassen. Entfernen Sie die ID-Eigenschaften und verwenden Sie generator = ObjectIdGenerators .IntSequenceGenerator. – teppic

Verwandte Themen