2016-12-11 9 views
3

JSONデシリアライズ

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

} 

私はボビーの学校は既にインスタンススクールA.

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

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

にマッピングされているように、次のクラスにJSONをマップする方法私は学生クラスでいくつか変わったものを試しました...

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; 
     } 
    } 
    } 
} 

問題は私がhavです同時に学校と学生の両方がJSONから解析されているので、学校のリストを取得する方法がわかりません。たぶん私はこれらを別々に解析する必要があるので、私は学校のリストを最初に持っていますか?

+0

何か試しましたか?あなたが何をしているのかははっきりしていません。 – 4castle

+0

申し訳ありませんが、私が取り組もうとしているアプローチの1つの例を使って、解決しようとしている問題をより詳しく説明しようとしました。 – Rawr

答えて

1

ジャクソンがお手伝いします。オブジェクトに注釈を付けるだけで@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

動作しませんでした。 '' {{"id":1、 "name": "Mary"、 "school":{"id":1、 "name": "セントマクダレン"}}、{"id": 2、 "name": "Bob"、 "school":1}] ' デシリアライズされると、学校オブジェクトにリンクされず、学校のIDだけが格納されます。 – Rawr

+0

申し訳ありませんが、結果を確認してください。型情報なしでは、逆シリアル化はハッシュセットのリストに対して行われました。私はJacksonがオブジェクトを構築するのに十分な情報を持っているように、Student []を使う例を更新しました。 – teppic

+0

代わりに、JacksonがIDを管理できるようにすることもできます。 'id'プロパティを削除し、' generator = ObjectIdGenerators .IntSequenceGenerator'を使います。 – teppic