2016-12-11 3 views
3

JSONDeserialize с Джексоном со ссылкой на существующий объект

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

} 

Как бы отобразить JSON в следующие классы, такие, что школа Бобби сопоставляется с уже реализованным школы А.

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

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

Я пробовал некоторые странные вещи с классом Студента ...

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

Простите, я попытался лучше объяснить проблему, которую я пытаюсь решить, например, одним из подходов, которые я пытался сделать. – 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 ":" St Magdalene's}}, {"id": 2, «name»: «Bob», «school»: 1}] ' Дессериализованный он не ссылается на объект школы, а скорее хранит только идентификатор школы. – Rawr

+0

Извините, я должен был проверить результат. Без информации типа десериализация была в списке хэш-наборов. Я обновил пример использования Student [], чтобы у Jackson было достаточно информации для создания объектов. – teppic

+0

В качестве альтернативы вы можете позволить Джексону управлять идентификаторами. Удалите свойства id и используйте 'generator = ObjectIdGenerators .IntSequenceGenerator'. – teppic

Смежные вопросы