使用 UTC 时区的 JacksonMapper 日期反序列化以给定格式失败
JacksonMapper Date deserialization with UTC time zone fails with given format
我知道有很多关于同一问题的重复问题,但是,我无法将给定的日期格式反序列化为 java.util.Date
对象。客户端 api 我正在使用 returns 6 位日期字段以及毫秒和纳秒。
- 2016-12-08T20:09:05.508883Z
- 2016-12-08T20:09:05.527Z
有时包括纳秒,有时不包括。我尝试遵循 jackson-databind 库本身的反序列化示例,但找不到解决方法。说这是例子 json blob
{
"id": "68e6a28f-ae28-4788-8d4f-5ab4e5e5ae08",
"created_at": "2016-12-08T20:09:05.508883Z",
"done_at": "2016-12-08T20:09:05.527Z"
}
Entity.java
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class OrderResponse {
private String id;
@JsonProperty("created_at")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'*'", timezone = "UTC")
private Date createdAt;
@JsonProperty("done_at")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'*'", timezone = "UTC")
private Date doneAt;
}
如果我只使用格式 yyyy-MM-dd'T'HH:mm:ss
jackson mapper 反序列化来自 jvm 本身的时区。但我需要使用 UTC 格式,我还尝试实现自定义反序列化器和序列化器,但效果不佳。我的问题是 java.util.Date
正确的对象类型?此外,我还尝试通过注册 new JavaTimeModule()
创建自己的对象映射器,但没有成功。
感谢您的帮助。
我发现 java.time.format.DateTimeFormatter
有 ISO_INSTANT
支持我正在寻找的格式的格式类型。
https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_INSTANT
基本上,我编写了自定义解串器
public class CustomInstantDeserializer extends JsonDeserializer<Instant> {
private DateTimeFormatter fmt = DateTimeFormatter.ISO_INSTANT.withZone(ZoneOffset.UTC);
@Override
public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
return Instant.from(fmt.parse(p.getText()));
}
}
在相关字段上带有 @JsonDeserialize
注释。
@JsonProperty("created_at")
@JsonDeserialize(using = CustomInstantDeserializer.class)
private Instant createdAt;
我知道有很多关于同一问题的重复问题,但是,我无法将给定的日期格式反序列化为 java.util.Date
对象。客户端 api 我正在使用 returns 6 位日期字段以及毫秒和纳秒。
- 2016-12-08T20:09:05.508883Z
- 2016-12-08T20:09:05.527Z
有时包括纳秒,有时不包括。我尝试遵循 jackson-databind 库本身的反序列化示例,但找不到解决方法。说这是例子 json blob
{
"id": "68e6a28f-ae28-4788-8d4f-5ab4e5e5ae08",
"created_at": "2016-12-08T20:09:05.508883Z",
"done_at": "2016-12-08T20:09:05.527Z"
}
Entity.java
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class OrderResponse {
private String id;
@JsonProperty("created_at")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'*'", timezone = "UTC")
private Date createdAt;
@JsonProperty("done_at")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'*'", timezone = "UTC")
private Date doneAt;
}
如果我只使用格式 yyyy-MM-dd'T'HH:mm:ss
jackson mapper 反序列化来自 jvm 本身的时区。但我需要使用 UTC 格式,我还尝试实现自定义反序列化器和序列化器,但效果不佳。我的问题是 java.util.Date
正确的对象类型?此外,我还尝试通过注册 new JavaTimeModule()
创建自己的对象映射器,但没有成功。
感谢您的帮助。
我发现 java.time.format.DateTimeFormatter
有 ISO_INSTANT
支持我正在寻找的格式的格式类型。
https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_INSTANT
基本上,我编写了自定义解串器
public class CustomInstantDeserializer extends JsonDeserializer<Instant> {
private DateTimeFormatter fmt = DateTimeFormatter.ISO_INSTANT.withZone(ZoneOffset.UTC);
@Override
public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
return Instant.from(fmt.parse(p.getText()));
}
}
在相关字段上带有 @JsonDeserialize
注释。
@JsonProperty("created_at")
@JsonDeserialize(using = CustomInstantDeserializer.class)
private Instant createdAt;