杰克逊本地日期模块注册仍然异常



我想用firstnamelastnamebirthday序列化具有类的不同对象Person的列表。在这里的论坛中查看了不同的问题后,我发现我需要注册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();
}
}

我的阅读器类是:

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的实例(不存在创建者,如默认构造):没有字符串参数构造函数/工厂方法从字符串值('1988-06-05')反序列化在[源:(FileInputStream);行:4,列:18](通过引用链:java.util.ArrayList[0]->Person["生日"])

我以为我只需要注册TimeModule之外什么也不需要做。我还需要为阅读器注册模块吗?还是我的代码有其他问题?

您正确地注册了JavaTimeModuleObjectMapper您的write()方法中。

ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());

但是您忘记在read()方法中使用ObjectMapper注册它。

ObjectMapper mapper = new ObjectMapper();

要修复它,只需在此处添加缺少的.registerModule(new JavaTimeModule())

或者更好的是:
writeread方法中删除本地ObjectMapper定义。 相反,请将其作为成员变量添加到类中,以便您可以使用 两种方法中的同一ObjectMapper实例。

private ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());

最新更新