Java LocalDateTime-使用LocalDateTime.parse反序列化

Java LocalDateTime-使用LocalDateTime.parse反序列化,java,json,datetime,jackson,deserialization,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(charsequencete

我有一个字段
initiationDate
,它通过
ToStringSerializer
类序列化为ISO-8601格式

@JsonSerialize(using = ToStringSerializer.class)
private LocalDateTime initiationDate;
当我收到以下JSON时

...
"initiationDate": "2016-05-11T17:32:20.897",
...
我想通过
LocalDateTime.parse(charsequencetext)
factory方法对其进行反序列化。我所有的尝试都以
com.fasterxml.jackson.databind.JsonMappingException
结束:

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

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


编辑:

通过将包含到项目中并使用
@JsonDeserialize
LocalDateTimeDeserializer
解决了该问题

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

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为你做转化。在内部,它使用标准格式之一的
LocalDateTime#parse
。幸运的是,它支持以下值

2016-05-11T17:32:20.897

开箱即用。

适用于希望解析自定义日期时间格式的用户

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

我不知道它使用了
parse
,但是您添加了适当的扩展吗?@SotiriosDelimanolis,不,它如何解决我的问题?我需要指定工厂方法
LocalDateTime.parse(“2016-05-11T17:32:20.897”)
很好用。谢谢,第二种方法对我来说更漂亮,我将它与
@JsonDeserialize
一起使用,而不是模块注册是的,我也使用了第二种方法:objectMapper.registerModule(新的JavaTimeModule());。我投了赞成票。@András你是说当你做post请求时,ClientRestObject中的LocalDateTime是空的吗?我也遇到了同样的问题,我想知道你是如何解决的。也许参加聚会迟到了,但请在此处查看接受的答案:
private static ObjectMapper buildObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    //To parse LocalDateTime
    objectMapper.registerModule(new JavaTimeModule());
    return objectMapper;
}