JSON правильно десериализует ArrayList - PullRequest
0 голосов
/ 30 ноября 2018

Я никогда раньше не работал с JSON и хотел сериализовать ArrayList<Person> в файл JSON.

Мой класс писателя выглядит так:

public class Writer {

public void write(){
    ArrayList<Person> personList = new ArrayList<>();

    Person p1 = new Person("James", "Bond", LocalDate.of(1997,9,22));
    Person p2 = new Person("Santa", "Claus", LocalDate.of(1918,11,6));
    Person p3 = new Person("Peter", "Griffin", LocalDate.of(1978,3,24));
    Person p4 = new Person("Lois", "Griffin", LocalDate.of(1982,7,14));

    personList.add(p1);
    personList.add(p2);
    personList.add(p3);
    personList.add(p4);

    ObjectMapper mapper = new ObjectMapper();
    ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());

    try {
        writer.writeValue(new File(System.getProperty("user.dir")+"/File/Person.json"), personList);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

А мой класс читателя выглядит такthis:

public class Reader {

public void read(){
    ObjectMapper mapper = new ObjectMapper();

    try {
        ArrayList<Person> liste = mapper.readValue(new FileInputStream("File/Personen.json"), ArrayList.class);
        System.out.println("Read: " + liste.get(0));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Первый объект в списке выглядит следующим образом: Gelesen: {firstname=James, lastname=Bond, birthday={year=1997, month=SEPTEMBER, monthValue=9, dayOfMonth=22, chronology={id=ISO, calendarType=iso8601}, era=CE, dayOfYear=265, dayOfWeek=MONDAY, leapYear=false}}

Как преобразовать эту строку JSON обратно в объект Java класса "person"?Что-то не так с моей сериализацией / десериализацией?

РЕДАКТИРОВАТЬ: я хотел проверить, если мой человек в списке, который десериализован из файла JSON, совпадает с исходным человеком, поэтому я написал System.out.println(list.get(0).getFirstname(), а затем яполучил java.lang.ClassCastException: java.base/java.util.LinkedHashMap cannot be cast to Person

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Первая проблема: вы десериализуетесь в ArrayList без какого-либо универсального типа, из-за этого вы получаете ArrayList из LinkedHashMap.Джексон не знает, что вам нужен список людей, поэтому он использует LinkedHashMap как тип, применимый к любому json.

Для десериализации списка людей вы должны использовать:

ArrayList<Person> list = mapper.readValue(new FileInputStream("./person.json"),
                    mapper.getTypeFactory().constructCollectionType(ArrayList.class, Person.class));

Вторые проблемы: что вы работаете с Java 8 раз (класс LocalDate), но Джексон не знает об этом.Чтобы иметь возможность обрабатывать его правильно, вам нужно добавить JavaTimeModule из jackson-datatype-jsr310 зависимости и зарегистрировать его.

Таким образом, полученный код будет выглядеть так:

public void write() {
    ArrayList<Person> personList = new ArrayList<>();

    Person p1 = new Person("James", "Bond", LocalDate.of(1997, 9, 22));
    Person p2 = new Person("Santa", "Claus", LocalDate.of(1918, 11, 6));
    Person p3 = new Person("Peter", "Griffin", LocalDate.of(1978, 3, 24));
    Person p4 = new Person("Lois", "Griffin", LocalDate.of(1982, 7, 14));

    personList.add(p1);
    personList.add(p2);
    personList.add(p3);
    personList.add(p4);

    ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());
    ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());

    try {
        writer.writeValue(new File("./person.json"), personList);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void read() {
    ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());

    try {
        ArrayList<Person> list = mapper.readValue(new FileInputStream("./person.json"),
                mapper.getTypeFactory().constructCollectionType(ArrayList.class, Person.class));
        System.out.println("Read: " + list.get(0).getFirstname());
    } catch (IOException e) {
        e.printStackTrace();
    }

}
0 голосов
/ 30 ноября 2018

пожалуйста, попробуйте этот код.Я думаю, что вам нужно конвертировать список массивов в формат JSON.и получить его в формате JSON.

public void write(){
    ArrayList<Person> personList = new ArrayList<>();
    JSONObject obj = new JSONObject();//JSON object.
    Person p1 = new Person("James", "Bond", LocalDate.of(1997,9,22));
    Person p2 = new Person("Santa", "Claus", LocalDate.of(1918,11,6));
    Person p3 = new Person("Peter", "Griffin", LocalDate.of(1978,3,24));
    Person p4 = new Person("Lois", "Griffin", LocalDate.of(1982,7,14));

    personList.add(p1);
    personList.add(p2);
    personList.add(p3);
    personList.add(p4);
    obj.put("list", personList);
    ObjectMapper mapper = new ObjectMapper();
    ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());
    try {
        writer.writeValue(new File(System.getProperty("user.dir")+"/File/Person.json"), obj);
    } catch (IOException e) {
        e.printStackTrace();
    } 
}

public void read(){
    ObjectMapper mapper = new ObjectMapper();
    try {
        JSONObject obj = mapper.readValue(new File("G:\\Personen.json"));
        // Convert JSON string from file to Object
        Person person = mapper.readValue(new File("G:\\Personen.json"), Person.class);
        System.out.println("Read: " + obj);

    } catch (IOException e) {
        e.printStackTrace();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...