当前位置: 首页 > 知识库问答 >
问题:

JacksonMapper日期与UTC时区的反序列化在给定格式下失败

颜镜
2023-03-14

我知道关于同一个问题有许多重复的问题,但是,我无法将给定的日期格式反序列化为java.util.Date对象。我使用的客户端api返回6位数的日期字段,并结合毫秒和纳秒。

  • 2016-12-08T20:09:05.508883Z

有时包括纳秒,有时不包括。我试图从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"
}

实体JAVA

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
html" target="_blank">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:ssjackson映射器反序列化来自jvm本身的时区。但我需要使用UTC格式,我还尝试实现自定义反序列化程序和序列化程序,但效果并不理想。我的问题是java。util。日期对象类型是否正确?此外,我还尝试通过注册new JavaTimeModule()创建自己的对象映射器,但没有成功。

谢谢帮忙。

共有1个答案

丁鸿信
2023-03-14

我发现java。时间总体安排DateTimeFormatterISO_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()));
    }
}

在相关字段上使用@jsondeselliate注释。

@JsonProperty("created_at")
@JsonDeserialize(using = CustomInstantDeserializer.class)
private Instant createdAt;
 类似资料:
  • 问题内容: 我正在使用Moment.js解析和格式化Web应用程序中的日期。作为JSON对象的一部分,我的后端服务器以UTC纪元(Unix偏移)为单位发送日期(以毫秒为单位)。 在特定时区中 解析日期很容易-只需在解析前将RFC 822时区标识符附加到字符串的末尾即可: 但是,如何格式化 特定时区中 的日期? 无论浏览器的当前时间如何,我都希望获得一致的结果,但是我不想以UTC显示日期。 问题答案

  • 问题内容: 我需要将日期格式化为特定的字符串。 我使用class使用“ ” 模式格式化日期,它将当前日期返回为 “ ”,但我需要为 “ ”。 下面是使用的编码, 输出 :格式化的字符串: 我需要的格式是在gmt时间之间添加冒号。 因为我正在使用Google日历插入事件,所以它仅接受我提到的必需格式。 问题答案: 您可以改用Joda Time。它具有可以满足您需求的format属性。 链接 最大优点

  • 我正在尝试使用Jackson将ISO8601格式的日期反序列化为Java8。我向ObjectMapper注册了JavaTimeModule,并关闭了设置。 但是,如果试图反序列化将不起作用,因为JavaTimeModule似乎只会反序列化使用UTC时区偏移量格式化的日期时间(例如)。然后我尝试使用注释,如下所示: 就像这样: 然而,这两种方法都不起作用,我得到了一个例外: 这意味着timezone

  • 我正在尝试用自定义日期格式序列化和反序列化相当简单的对象: 在执行main方法时,我希望得到类似于: “日期”:“20151117” 20151117 但不幸的是得到了以下几点: {“日期”:“20151117”} 20151117-01-01T00:00:00.000+03:00(年份不正确) 似乎Jackson忽略了对象反序列化的@JSONFORMAT注释,并将字符串视为ISO-8601符号中

  • 我已经将Spring Boot应用程序配置为以我希望的格式()返回日期,但是在JSON中接受这种格式的值有问题。 这些都是我到目前为止所做的事情: 为添加了maven依赖项: 在我的数据库中,我以以下格式将此日期存储为时间戳:。 如果我通过我的控制器访问这个实体,它将返回具有正确startDate格式的JSON。但是,当我尝试使用格式发布并反序列化它时,我会遇到以下异常: 我知道有很多关于这个话题

  • 问题内容: 我正在尝试使用Jackson 将ISO8601格式的日期反序列化为Java8 。我向ObjectMapper注册了JavaTimeModule,并关闭了该设置。 但是,如果尝试反序列化,它将无法正常工作,因为JavaTimeModule似乎只会反序列化具有UTC时区偏移量的日期时间(例如)。然后,我尝试使用如下注释: 像这样: 但是,这些都不起作用,我得到一个例外: 这意味着将忽略ti