如何使用Jackson序列化LocalDateTime?

2022-09-02 02:53:23

我得到了以下代码:

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    String now = new ObjectMapper().writeValueAsString(new SomeClass(LocalDateTime.now()));
    System.out.println(now);

我得到这个:

{“time”:{“hour”:20,“minute”:49,“second”:42,“nano”:99000000,“dayOfYear”:19,“dayOfWeek”:“Thursday”,“month”:“JANUARY”,“dayOfMonth”:19,“year”:2017,“monthValue”:1,“chronology”:{“id”:“ISO”,“calendarType”:“iso8601”}}}

我想实现的是ISO8601中的字符串

2018-19-19T10:43:41Z


答案 1

这可能是由于代码中的错误。您正在使用新的未配置的映射器实例,以下是修复程序:

 ObjectMapper mapper = new ObjectMapper();
 mapper.registerModule(new JavaTimeModule());
 mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
 String now = mapper.writeValueAsString(new SomeClass(LocalDateTime.now()));
 System.out.println(now);

答案 2

这是您可以执行的操作:OffsetDateTime

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "uuuu-MM-dd'T'HH:mm:ss.SSSXXXX")
private OffsetDateTime timeOfBirth;

对于 LocalDateTime,您不能使用 XXXX(区域偏移),因为没有偏移信息。所以你可以放下它。但 ISO8601 不鼓励使用本地时间,因为它不明确:

如果没有给出具有时间表示形式的 UTC 关系信息,则假定时间为本地时间。虽然在同一时区进行通信时可以安全地假定本地时间,但在跨不同时区进行通信时,它却模棱两可。即使在单个地理时区内,如果该区域遵守夏令时,某些本地时间也会不明确。通常最好使用标准的表示法来指示时区(区域指示符)。


推荐