【发布时间】:2018-10-03 08:14:17
【问题描述】:
我们正在从 Joda 迁移到 Java Time。目前我们在实体中使用 Joda 的DateTime。 AFAIK DateTime 相当于 Java 中的两种类型:OffsetDateTime 和 ZonedDateTime。由于我们要将它们保存在 DB 中,因此我们将使用 OffsetDateTime(对此有何评论?)。
现在的问题是如何正确配置杰克逊的ObjectMapper。
我在网上找到的所有示例都是关于 Jackson 已经提供的 de/serializer 实现的本地类型(例如 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 日期时间值的最佳方法是什么?
更新:接受的答案并不能真正解决我的问题(阅读 cmets 中的讨论)。我最终得到了比我在上面提出的更简单的代码。也请参阅我自己的答案。
【问题讨论】:
-
你不需要自己写,Java 8 日期和时间 API 已经有一个 Jackson 模块:github.com/FasterXML/jackson-modules-java8
-
更新了问题。如何使用自定义格式?
-
我想是的。我们的格式是
2016-05-11T17:32:20.897+0000或2016-05-11T17:32:20.897+00:00(没有祖鲁符号)(我们希望支持多种输入格式)
标签: java jackson java-time jackson-databind jackson-modules