【发布时间】:2017-03-22 02:57:33
【问题描述】:
我使用的是 Jackson 2.8,需要与一个不允许在 ISO 8601 时间戳内以毫秒为单位的 API 进行通信。
预期的格式是这样的:"2016-12-24T00:00:00Z"
我正在使用 Jackson 的 JavaTimeModule,并将 WRITE_DATES_AS_TIMESTAMPS 设置为 false。
但这将打印毫秒。
所以我尝试使用 objectMapper.setDateFormat 并没有改变任何东西。
我目前的解决方法是这样的:
ObjectMapper om = new ObjectMapper();
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.appendInstant(0)
.toFormatter();
JavaTimeModule jtm = new JavaTimeModule();
jtm.addSerializer(Instant.class, new JsonSerializer<Instant>() {
@Override
public void serialize(Instant value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
gen.writeString(dtf.format(value));
}
});
om.registerModule(jtm);
我正在覆盖 Instant.class 的默认序列化程序,它可以工作。
有什么好的方法可以使用一些配置参数来解决这个问题吗?
【问题讨论】:
-
你试过
DateTimeFormatter.ISO_INSTANT作为一种格式吗? docs.oracle.com/javase/8/docs/api/java/time/format/… -
目标 API 不受您的控制?
-
是的,试过了。它还将打印毫秒。如果我明确创建一个
Instant并将毫秒设置为0,也许它会起作用。但这对我的用例来说还不够安全。它必须始终忽略/丢弃毫秒以进行序列化。... EDIT:是的,API 来自某个外部公司。没有控制权。 -
这几乎是相反但相同的主题:stackoverflow.com/questions/45276807/…
标签: java jackson java-time jackson-modules jackson2