杰克逊convertValue不使用JavaTimeModule

时间:2018-11-15 13:19:22

标签: java json jackson

如果我创建一个POJO类,并使用mapper.writeValueAsString()方法将整个对象转换为Json,或者让Spring处理转换,则将正确使用JavaTimeModule;如果我的POJO具有{{1 }},它将转换为类似OffsetDateTime的字符串。

在某些情况下,我需要使用映射器的2018-10-16T13:49:34.564748+02:00方法并手动构建一个T convertValue(Object fromValue, Class<T> toValueType)。该方法不会像转换ObjectNode那样转换OffsetDateTime对象。

我像这样构造我的Jackson映射器:

writeValueAsString

使用映射器,我可以轻松地将List转换为他们的Json字符串:

ObjectMapper defaultMapperObj = new ObjectMapper();
defaultMapperObj.registerModule(new GuavaModule());
defaultMapperObj.registerModule(new Jdk8Module());
defaultMapperObj.registerModule(new JavaTimeModule());
defaultMapperObj.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

结果:

mapper.convertValue(
        Arrays.asList(1,2,23), JsonNode.class
)

但是如果我这样称呼:

ArrayNode: [1,2,23]

我得到一个mappper.convertValue(OffsetDateTime.now(), JsonNode.class) DecimalNode

1 个答案:

答案 0 :(得分:1)

摘自JavaTimeModule文档:

  

如果启用了java.time功能,大多数SerializationFeature.WRITE_DATES_AS_TIMESTAMPS类型将被序列化为数字(适当时为整数或小数),否则将以标准ISO-8601字符串表示形式进行序列化。 [...]

因此,要获得所需的结果,请在您的SerializationFeature.WRITE_DATES_AS_TIMESTAMPS实例中禁用ObjectMapper功能:

mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);