LocalDateTime - 使用LocalDateTime.parse进行反序列化

时间:2016-05-11 14:50:15

标签: java json datetime jackson deserialization

我有字段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结束:

  

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

我如何实现这一目标?如何指定工厂方法?

编辑:

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

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

2 个答案:

答案 0 :(得分:25)

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;

Module

或者您可以将Jackson's java.time extension添加到类路径中,并使用ObjectMapper注册相应的objectMapper.registerModule(new JavaTimeModule());

LocalDateTime#parse
让杰克逊为你做转换。在内部,它使用2016-05-11T17:32:20.897 和其中一种标准格式。幸运的是,它支持像

这样的值
Error: No matches

开箱即用。

答案 1 :(得分:6)

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

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;
}