【问题标题】:Java Spring: Jackson deserialization to ZonedDateTimeJava Spring:Jackson 反序列化为 ZonedDateTime
【发布时间】:2019-06-18 08:17:59
【问题描述】:

假设我想使用以下类从外部 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。

【问题讨论】:

标签: java spring parsing jackson zoneddatetime


【解决方案1】:

模式中的 Z 不接受值中的文字“Z”,使用 X 代替应该可以工作:

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

模式被指定为 Java SimpleDateFormat - Java 10 引用 here

【讨论】:

    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-13
      • 2019-01-26
      • 2016-04-25
      • 1970-01-01
      • 2016-04-18
      • 2022-12-12
      • 2019-01-01
      • 2019-12-02
      相关资源
      最近更新 更多