Java Spring: Jackson 反序列化为 ZonedDateTime
Java Spring: Jackson deserialization to ZonedDateTime
假设以下 class 我想使用来自外部 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。
模式中的 Z 不接受值中的文字 'Z',改用 X 应该可行:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX")
模式指定为 Java SimpleDateFormat
- Java 10 参考 here.
您应该将 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;
假设以下 class 我想使用来自外部 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。
模式中的 Z 不接受值中的文字 'Z',改用 X 应该可行:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX")
模式指定为 Java SimpleDateFormat
- Java 10 参考 here.
您应该将 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;