我们正在从Joda迁移到Java Time。目前我们在实体中使用Joda的DateTime
。AFAIK DateTime
相当于Java中的两种类型:OffsetDateTime
和ZonedDateTime
。由于我们要将它们持久化到DB中,因此我们将使用OffsetDateTime
(对此有何评论?)
现在的问题是如何正确配置Jackson的ObjectMapper
。我在网上找到的所有示例都是关于Jackson已经提供的反序列化器实现的本地类型(例如LocalDateTime
,LocalDateTimeSerializer
和LocalDateTimeDeserializer
)。
我终于做到了这样一件事:
public class OffsetDateTimeSerializer extends StdSerializer<OffsetDateTime> {
private final DateTimeFormatter formatter; // We need custom format!
public OffsetDateTimeSerializer(DateTimeFormatter formatter) {
super(OffsetDateTime.class);
this.formatter = formatter;
}
@Override
public void serialize(OffsetDateTime value, JsonGenerator generator, SerializerProvider provider) throws IOException {
generator.writeString(value.format(formatter));
}
}
字符串
和
public class OffsetDateTimeDeserializer extends StdDeserializer<OffsetDateTime> {
private final DateTimeFormatter formatter; // We need custom format!
public OffsetDateTimeDeserializer(DateTimeFormatter formatter) {
super(OffsetDateTime.class);
this.formatter = formatter;
}
@Override
public OffsetDateTime deserialize(JsonParser parser, DeserializationContext ctx) throws IOException {
return OffsetDateTime.parse(parser.readValueAs(String.class), formatter);
}
}
型
现在我的问题是,配置Jackson的ObjectMapper
来反序列化Java 8日期-时间值的最佳方法是什么?
最新消息:公认的答案并不能真正解决我的问题(请阅读评论中的讨论)。我最终得到了比我在上面提出的代码简单一点的代码。也请参阅我自己的答案。
4条答案
按热度按时间ufj5ltwl1#
您不需要为JSR-310类型编写自定义的序列化器和反序列化器。Jackson有一个自定义模块来处理这一问题,并将为您提供所需的serializer和deserializer。
首先将
jackson-datatype-jsr310
工件添加到依赖项中:字符串
然后在
ObjectMapper
中注册JavaTimeModule
模块:型
大多数JSR-310类型将使用标准ISO-8601字符串表示进行序列化。如果需要自定义格式,可以使用自己的序列化器和反序列化器实现。
详情请参阅documentation。
nwsw7zdq2#
好了,我最后得到了以下代码(代码少了一点,没有具体的类):
字符串
nqwrtyyt3#
你可以检查这个答案,它包含了很多关于如何使用java.time类和自定义格式的信息:https://stackoverflow.com/a/46263957
要解析“+00:00”和“+0000”,您可以使用带有可选部分的
DateTimeFormatterBuilder
:字符串
zc0qhyus4#
Sping Boot 为Jackson做了依赖管理,在2.6之后,jsr 310模块可以自动管理,所以你只需要使用Jackson2.6+,模块就被添加了,在
com.fasterxml.jackson.datatype:jackson-datatype-jsr310
中可用。如果你可以访问
ObjectMapper
,比如在单元测试中,你可以注册JavaTimeModule
。如果你没有,比如JSON作为@RequestBody
出现时,你必须在application.properties中配置:字符串
并在JSON中指定日期格式,如:
型
并且字符串将被正确解析。格式使用
SimpleDateFormat
中指定的字母。注意结尾处
X
的数量;不同长度的X
表示不同形式的区域偏移。阅读Java APISimpleDateFormat
部分以获取更多信息。