Я хотел сериализовать список с различными объектами класса Person
с firstname
, lastname
и birthday
.Посмотрев различные вопросы на форуме, я обнаружил, что мне нужно зарегистрировать jsr.310.JavaTimeModule
для сериализации LocalDate birthday
.Я знаю, что на этом сайте есть много записей по этой теме, но большинство из них говорят, что регистрации модуля достаточно для обработки LocalDate
.
Это мой класс писателя:
public void write(){
ArrayList<Person> personList = new ArrayList<>();
Person p1 = new Person("Peter", "Griffin", LocalDate.of(1988,6,5));
Person p2 = new Person("Lois", "Griffin", LocalDate.of(1997,9,22));
personList.add(p1);
personList.add(p2);
ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());
ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());
try {
writer.writeValue(new File(System.getProperty("user.dir")+"/File/Personen.json"), personList);
} catch (IOException e) {
e.printStackTrace();
}
}
, а мой класс Reader:
public void read(){
ObjectMapper mapper = new ObjectMapper();
try {
ArrayList<Person> liste = mapper.readValue(new FileInputStream("File/Personen.json"),
mapper.getTypeFactory().constructCollectionType(ArrayList.class, Person.class));
System.out.println(liste.get(0).getFirstname());
} catch (IOException e) {
e.printStackTrace();
}
}
После прочтения файла я получаю
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Невозможно создать экземпляр java.time.LocalDate (не существует создателей, таких как конструкция по умолчанию): нет конструктора аргумента-строки / метода фабрики для десериализации из значения String ('1988-06-05 ')
в [Источник: (FileInputStream);строка: 4, столбец: 18] (через цепочку ссылок: java.util.ArrayList [0] -> Person ["birthday"])
Я думал, что мне больше ничего не нужно делатьчем регистрация TimeModule
.Нужно ли регистрировать модуль для ридера?Или есть другая проблема с моим кодом?