LocalDateTime - 使用 LocalDateTime.parse 反序列化

Posted

技术标签:

【中文标题】LocalDateTime - 使用 LocalDateTime.parse 反序列化【英文标题】:LocalDateTime - deserialization with LocalDateTime.parse 【发布时间】:2016-09-07 01:35:15 【问题描述】:

我有 initiationDate 字段,它按 ToStringSerializer 类序列化为 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结束:

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

我如何做到这一点?如何指定工厂方法?


编辑:

问题已通过将jackson-datatype-jsr310 module 包含到项目中并将@JsonDeserializeLocalDateTimeDeserializer 一起使用来解决。

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

【问题讨论】:

我不知道它使用parse,但是你添加了适当的扩展,here? @SotiriosDelimanolis,不,它如何解决我的问题?我需要指定工厂方法。 LocalDateTime.parse("2016-05-11T17:32:20.897") 工作正常。 【参考方案1】:

Vanilla Jackson 无法从任何 JSON 字符串值反序列化LocalDateTime 对象。

您有几个选择。您可以创建并注册自己的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;

或者您可以将Jackson's java.time extension 添加到您的类路径中,并使用您的ObjectMapper 注册适当的Module

objectMapper.registerModule(new JavaTimeModule());

让 Jackson 为您完成转换。在内部,它使用LocalDateTime#parse 和其中一种标准格式。幸运的是,它支持像

这样的值
2016-05-11T17:32:20.897

开箱即用。

【讨论】:

谢谢,第二种方式对我来说更漂亮,我用@JsonDeserialize代替了模块注册 是的,我也采用了第二种方式:objectMapper.registerModule(new JavaTimeModule());。我投了赞成票。【参考方案2】:

对于那些想要解析自定义日期时间格式的人。

1) 添加依赖

compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.8"

2) 日期时间格式的Json注解

public class ClientRestObject 

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime timestamp;


3) 在 ObjectMapper 中注册 Java8 模块

private static ObjectMapper buildObjectMapper() 
    ObjectMapper objectMapper = new ObjectMapper();
    //To parse LocalDateTime
    objectMapper.registerModule(new JavaTimeModule());
    return objectMapper;

【讨论】:

@András 你是说当你发出一个帖子请求时,你的 ClientRestObject 中的 LocalDateTime 是空的吗?我遇到了同样的问题,想知道您是如何解决的。 可能迟到了,但请在此处查看接受的答案:***.com/questions/40327970/…

以上是关于LocalDateTime - 使用 LocalDateTime.parse 反序列化的主要内容,如果未能解决你的问题,请参考以下文章

java8中的常用日期操作

LocalDateTime - 使用 LocalDateTime.parse 反序列化

使用杰克逊的 LocalDateTime 解析

LocalDateTime 以数组格式表示

JAVA8的LocalDateTime使用心得和工具类

MyBatis使用LocalDateTime遇到的一系列问题