java - JacksonMapper 使用 UTC 时区的日期反序列化在给定格式下失败

标签 java jackson fasterxml date

我知道同一个问题有很多重复的问题,但是,我无法将给定的日期格式反序列化为 java.util.Date 对象。我使用的客户端 API 返回 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映射器会使用来自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 - JacksonMapper 使用 UTC 时区的日期反序列化在给定格式下失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53383409/

相关文章:

java - 反序列化 JSON 请求中包含许多对象的列表期间的性能问题

java - 在不使用中央服务器的情况下生成唯一编号

java - 如何使用 Jackson 序列化/反序列化第三方 Java 对象

java - 使用 gson.toJson 序列化嵌套的 org.json.JSONObject 添加到 "map"键

maven - Spark Streaming + json4s-jackson 依赖问题

json - Spring Boot HttpMediaTypeNotSupportedException

java - Fasterxml Jackson 映射 - 数据未正确绑定(bind)

java - 在不同分支之间向下 merge/向上 merge 更改时如何解决 pom.xml 冲突?

java - 这个 NullPointerException 的来源是什么

java - 我怎样才能在我的 mainActivity 中实现这个类