当前位置: 首页 > 面试题库 >

LocalDateTime-使用LocalDateTime.parse反序列化

芮明知
2023-03-14
问题内容

我有initiationDateToStringSerializer类别序列化为ISO-8601格式的字段。

@JsonSerialize(using = ToStringSerializer.class)
private LocalDateTime initiationDate;

当我收到以下JSON时,

...
"initiationDate": "2016-05-11T17:32:20.897",
...

我想通过LocalDateTime.parse(CharSequence text)工厂方法反序列化。我所有的尝试都以com.fasterxml.jackson.databind.JsonMappingException

无法java.time.LocalDateTimeString值('2016-05-11T17:32:20.897')实例化类型[简单类型,类]的值;没有单一的String构造函数/工厂方法

我该如何实现?如何指定工厂方法?

编辑:

通过将jackson-datatype-jsr310模块包含到项目中并与一起使用@JsonDeserialize,解决了该问题
LocalDateTimeDeserializer

@JsonSerialize(using = ToStringSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime initiationDate;

问题答案:

香草杰克逊没有一种方法来 反序列化 一个LocalDateTime从任何JSON字符串值对象

您有几种选择。您可以创建和注册自己的JsonDeserializer使用方法LocalDateTime#parse

class ParseDeserializer extends StdDeserializer<LocalDateTime> {
    public ParseDeserializer() {
        super(LocalDateTime.class);
    }

    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        return LocalDateTime.parse(p.getValueAsString()); // or overloaded with an appropriate format
    }
}
...
@JsonSerialize(using = ToStringSerializer.class)
@JsonDeserialize(using = ParseDeserializer.class)
private LocalDateTime initiationDate;

或者你也可以添加杰克逊的java.time延伸到类路径中并注册相应的Module与你的ObjectMapper

objectMapper.registerModule(new JavaTimeModule());

让杰克逊为您做转换。在内部,这LocalDateTime#parse与一种标准格式一起使用。幸运的是,它支持像

2016-05-11T17:32:20.897

盒子外面。



 类似资料:
  • 我有一个字段,它通过类序列化为ISO-8601格式。 当我收到以下JSON时, 通过将jackson-datatype-jsr310模块包含到项目中,并使用和解决了这个问题。

  • 问题内容: 我已经在SO中阅读了一些关于答案的问题,这些问题与JSON属性之间的序列化和反序列化有关,但我似乎无法使其正常工作。 我已经设法将Spring Boot应用程序配置为以所需的格式()返回日期,但在以JSON格式接收值时遇到问题。 这些是我到目前为止所做的所有事情: 增加了对Maven的依赖: 在我的主要课程中指定: 禁用序列化作为时间戳记: 这是我的日期时间实体映射: 在我的数据库中,

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

  • 我正在尝试使用Jackson将反序列化为,但它不起作用。 我有一个带有LocalDateTime字段的数据类: 我添加了特殊的Jackson数据类型模块: 序列化可以在以下情况下正常工作: 结果字符串: 但反序列化不适用于: 作为错误,我得到: 我错过了什么?我对串行化有效而反序列化无效感到困惑。 MWE:(小格拉德尔Java项目) Main.java: build.gradle:

  • 我们在elasticsearch索引中有一个日期字段,其中填充了一个长的。 字段映射为: 我使用和进行此配置: 但是当我试图用一个字段解析索引中的实体时,例如: 我收到一个错误: 我认为,可以将一个长的反序列化为一个日期,但我看不出我遗漏了什么。 如果我把它映射到Long,它当然会起作用,如果值存储为String,并且我们在JsonFormat中正确地对其进行造型和格式化,它也会起作用。但是有没有

  • 我得到了以下代码: 我得到了这个: {"时间":{"小时": 20,"分钟": 49,"秒": 42,"纳米": 99000000,"一天": 19,"一天":"星期四","月":"一月","一天": 19,"年": 2017,"月值": 1,"年表":{"id":"ISO","calendarType":"iso8601"}}} 我要实现的是ISO8601中的字符串 2017-01-19T18: