【问题标题】:@JsonFormat deserialization fails@JsonFormat 反序列化失败
【发布时间】:2016-11-06 21:33:14
【问题描述】:

我有一个只有一个字段的课程:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "PST")
@JsonProperty("myDate")
private Date myDate;

当我尝试将 json 字符串反序列化为对象时:

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.setTimeZone(TimeZone.getTimeZone("PST"));

ObjectNode node = objectMapper.createObjectNode();
node.put("myDate", "2016-11-06");

Object pojo = objectMapper.treeToValue(node, SomeClass.class);

此异常失败:

com.fasterxml.jackson.databind.JsonMappingException: Failed to parse Date value '2016-11-06' (format: "yyyy-MM-dd'T'HH:mm:ss.SSSZ"): Unparseable date: "2016-11-06"
.
.
.
Caused by: java.lang.IllegalArgumentException: Failed to parse Date value '2016-11-06' (format: "yyyy-MM-dd'T'HH:mm:ss.SSSZ"): Unparseable date: "2016-11-06"
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:158)
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:261)
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:245)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:490)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:260)

注解,@JsonFormat 不应该只适用于序列化吗?至少这就是我通过阅读此常见问题所理解的:http://wiki.fasterxml.com/JacksonFAQDateHandling。在这里,我无法将 json 字符串反序列化为对象。

即使是 JsonFormat java 文档也没有提到它在反序列化过程中被使用:http://fasterxml.github.io/jackson-annotations/javadoc/2.0.0/com/fasterxml/jackson/annotation/JsonFormat.html

我是不是理解错了这个功能,还是我在代码中做错了什么?

【问题讨论】:

    标签: jackson datetime-format


    【解决方案1】:

    不,@JsonFormat 注解适用于 serailization 和 deserailization。因此,在反序列化中,它用于使用 DateFormat.parse 方法将日期时间字符串解析为日期时间对象,而在序列化中,日期时间对象使用 DateFormat.format 方法格式化为日期时间字符串。

    有关详细信息,请查看 DateSerializer 和 DateDeserializers 类。

    如果值是 UTC 时间,您应该只使用“Z”。因此,在您的情况下,将日期时间格式更改为“yyyy-MM-dd'T'HH:mm:ss.SSS”,并将日期时间值作为“2016-11-06T05:00:35.657”传递。这样就解析成功了。

    【讨论】:

    • 是的,我弄错了。当我在我使用的模式中删除“Z”时,我能够解析字符串。
    • 错了。序列化不受此注解的影响。
    • 据我所知,反序列化会受到@JsonFormat(timezone = "xxx").的影响所以文档有误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多