Java Spring:将Jackson反序列化为ZonedDateTime

时间:2019-01-24 14:47:46

标签: java spring parsing jackson zoneddatetime

假设要使用以下类从外部JSON有效负载进行反序列化:

public class MyObject {

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    private ZonedDateTime timestamp;

}

当我尝试使用JSON有效负载时,Jackson抛出以下错误:

Cannot deserialize value of type `java.time.ZonedDateTime` from String "2019-01-23T12:54:18.610Z": Failed to deserialize java.time.ZonedDateTime: (java.time.format.DateTimeParseException) Text '2019-01-23T12:54:18.610Z' could not be parsed at index 23

如您所见,传入的字符串为"2019-01-23T12:54:18.610Z",据我了解,这是有效的ZonedDateTime。使用jshell,使用ZonedDateTime.parse("2019-01-23T12:54:18.610Z")将该字符串解析为ZonedDateTime会产生一个有效的ZonedDateTime,就像我期望的那样。

  • 为什么杰克逊在这里失败了?
  • 我该怎么做才能使其正常工作?

我也不是Spring或Jackson的专家。谢谢。

编辑:我正在使用Spring Boot v2.1.1.RELEASE。

2 个答案:

答案 0 :(得分:3)

模式中的Z将不接受值中的文字“ Z”,而应使用X来工作:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX")

该模式被指定为Java SimpleDateFormat-Java 10参考here

答案 1 :(得分:2)

您应将Z替换为X,例如yyyy-MM-dd'T'HH:mm:ss.SSSX

请参见doc

Symbol  Meaning                     Presentation      Examples
X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
Z       zone-offset                 offset-Z          +0000; -0800; -08:00;