LocalDateTime - 使用 LocalDateTime.parse 反序列化

2022-09-02 03:14:25

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

@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 模块包含在项目中并与 .@JsonDeserializeLocalDateTimeDeserializer

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

答案 1

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

您有几种选择。您可以创建并注册自己的,这将使用.JsonDeserializerLocalDateTime#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 的 java.time 扩展名添加到类路径中,并向 您的 .ModuleObjectMapper

objectMapper.registerModule(new JavaTimeModule());

并让杰克逊为您进行转换。在内部,这与标准格式之一一起使用。幸运的是,它支持这样的值LocalDateTime#parse

2016-05-11T17:32:20.897

开箱即用。


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