Я хочу десериализовать JSON со структурой, приведенной ниже, в данный класс Java - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь прочитать данный формат JSON, используя Джексона, в класс Student, который содержит набор объектов другого класса Details. java

Как выполнить этот анализ?

objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
Student student = = new ObjectMapper().readValue(JSON_INPUT, Student.class);

JSON

{

    "studentName": Mikhael,
    "studentID": 251,
    "details": [  
         {"detail1": value1, detail2: value2},
         {"detail1": value3, detail2: value4}
     ] 

}  

Студент. java

public class Student {

    private String studentName;
    private int studentID;
    private Set<Details> details;

    public Student(String studentName, Integer studentID, Set<Details> details){
        this.studentName = studentName;
        this.studentID = studentID;
        this.details = details;
    }

}

Подробности. java

public class Details {

    private String detail1;
    private String detail2;

    public Details(String detail1, String detail2){
        this.detail1 = detail1;
        this.detail2 = detail2;
    }

}


1 Ответ

2 голосов
/ 05 марта 2020

Если это вариант, я бы использовал библиотеку gson . Он использует отражение, поэтому он не нуждается в установщиках для заполнения данных. И эти конструкторы также не будут использоваться.

С этой библиотекой вы можете выполнить десериализацию всего за одну строку, как вы ранее определили классы Student и Details со свойствами, которые соответствуют:

Student studentObject = new Gson().fromJson(JSON_INPUT, Student.class);

Затем вам нужно будет добавить несколько геттеров, чтобы получить данные о StudentObject.

Обновление

Думаю, я также нашел, что не так с тем Джексоном ObjectMapper, который вы использовали. Согласно этот сайт Джексон работает по-другому, и если поле не опубликовано c, как те, которые вы должны определить сеттеры или геттеры, и библиотека будет использовать их.

Сеттер делает неопубликованное c поле десериализуемо только для поля, тогда как получатель делает непубличное c поле сериализуемым и десериализуемым.

Поэтому вам нужно добавить сеттеры или геттеры для studentName, studentID, details, detail1 & detail2, если Вы все еще предпочитаете использовать Джексона, иначе он не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...