java - 将 Instant.ofEpochSecond() 对象格式反序列化为 Instant?

标签 java serialization jackson objectmapper

我定义了以下模型

public class ItemDetail {
    private final String name;
    private final String id;
    private final Instant someDate;
}

我将 someDate 设置为 setSomeDate(Instant.ofEpochSecond(resultSet.getLong("someDate"))。我正在从数据库中读取此内容。

我正在序列化此模型以返回以下响应,其中分配了 someDate Instant.ofEpochSecond()

{
  "name": "Some nights",
  "id": "XYZZ01AS",
  "someDate": {
        "nano": 0,
        "epochSecond": 1292486400
    }
}

我的客户端代码解析此响应,并且我对输出感到满意。

现在,我想对此进行测试,并希望在我的测试中反序列化此响应。假设上述响应存储在 response 变量中。

String response = ..... //string containing json response same as above format 
ItemDetail itemDetail = objectMapper.readValue(response, ItemDetail.class);

即使在注册了new ObjectMapper().registerModule(new JavaTimeModule())之后,这也不起作用(显然)。 它抛出以下错误

com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected one of [VALUE_STRING, VALUE_NUMBER_INT, VALUE_NUMBER_FLOAT] for java.time.Instant value 

有没有办法在不实现自定义反序列化器的情况下完成这项工作?

注意:我只想将其作为测试的一部分,并不打算对定义的模型 ItemDetail 进行任何更改。

最佳答案

JavaTimeModule 在序列化期间应处于 Activity 状态 new ObjectMapper().registerModule(new JavaTimeModule()); 。否则,Objectmapper 会将 Instant 数据类型转换为带有 epochSecondnano

的嵌套对象

关于java - 将 Instant.ofEpochSecond() 对象格式反序列化为 Instant?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51410737/

相关文章:

java - 暂停 For 循环/更好的想法如何解决这个问题

java - volatile 变量读取行为

java - 序列化外部库

json - 使用 Jackson 序列化带有排序键的 JSON

spring - 设置 Jackson 功能 WRITE_DATES_AS_TIMESTAMPS 在 Spring Boot 中不起作用

Java 重写说明

java - Spring Batch 异步处理器 - AsyncItemProcessor 不生效,启动时获取作业状态 COMPLETED

php - 在 WooCommerce 3 中获取产品属性详细信息

javascript:如何在没有jquery或其他库的情况下将表单数据序列化为字符串

kotlin - 为什么 jackson 不能反序列化这个 JSON?