Jackson LocalDate模块注册仍然异常

时间:2018-12-04 19:44:13

标签: java json serialization jackson localdate

我想使用Personfirstnamelastname将类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值反序列化的String参数自变量/工厂方法(' 1988-06-05')
   在[来源:(FileInputStream);第4行,第18列](通过参考链:java.util.ArrayList [0]-> Person [“ birthday”])

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

1 个答案:

答案 0 :(得分:1)

您已将JavaTimeModule正确注册到 ObjectMapper中的write()

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

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

ObjectMapper mapper = new ObjectMapper();

要解决此问题,只需在此处添加缺少的.registerModule(new JavaTimeModule())

或更妙的是:
ObjectMapperwrite方法中删除本地read定义。 而是将其作为成员变量添加到您的类中,以便您可以使用 两种方法中都使用相同的ObjectMapper实例。

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