【问题标题】:LocalDateTime - deserialization with LocalDateTime.parseLocalDateTime - 使用 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") 工作正常。

标签: java json datetime jackson deserialization


【解决方案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 是空的吗?我遇到了同样的问题,想知道您是如何解决的。
  • 可能迟到了,但请在此处查看接受的答案:stackoverflow.com/questions/40327970/…
猜你喜欢
  • 1970-01-01
  • 2021-01-19
  • 2017-03-12
  • 2023-04-04
  • 2014-01-29
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多