gpt4 book ai didi

java - Jackson LocalDate 模块注册仍然异常

转载 作者:行者123 更新时间:2023-11-30 01:58:33 25 4
gpt4 key购买 nike

我想用 Person 类的不同对象序列化列表,其中包含 firstnamelastnamebirthday >。在查看论坛中的不同问题后,我发现我需要注册jsr.310.JavaTimeModule来序列化LocalDate生日。我知道这个网站上有很多关于这个主题的条目,但大多数都说注册模块足以处理 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: Cannot construct instance of java.time.LocalDate (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('1988-06-05')
at [Source: (FileInputStream); line: 4, column: 18] (through reference chain: java.util.ArrayList[0]->Person["birthday"])

我认为除了注册 TimeModule 之外,我不需要做任何其他事情。我还需要为阅读器注册一个模块吗?或者我的代码还有其他问题吗?

最佳答案

您已正确注册了 JavaTimeModulewrite() 方法中的 ObjectMapper

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());

关于java - Jackson LocalDate 模块注册仍然异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53620342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com