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

And*_*lko 18 java datetime json jackson deserialization

我有initiationDateToStringSerializerISO-8601格式按类序列化的字段.

@JsonSerialize(using = ToStringSerializer.class)
private LocalDateTime initiationDate;
Run Code Online (Sandbox Code Playgroud)

当我收到以下JSON时

...
"initiationDate": "2016-05-11T17:32:20.897",
...
Run Code Online (Sandbox Code Playgroud)

我想通过LocalDateTime.parse(CharSequence text)工厂方法反序列化它.我的所有尝试都以com.fasterxml.jackson.databind.JsonMappingException:

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

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


编辑:

通过将jackson-datatype-jsr310模块包含到项目中并使用@JsonDeserializewith 来解决该问题 LocalDateTimeDeserializer.

@JsonSerialize(using = ToStringSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime initiationDate;
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 28

香草杰克逊没有一种方法来反序列化一个LocalDateTime从任何JSON字符串值对象.

你有几个选择.您可以创建并注册自己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;
Run Code Online (Sandbox Code Playgroud)

或者你可以将杰克逊的java.time扩展添加到你的类路径中并注册适当ModuleObjectMapper.

objectMapper.registerModule(new JavaTimeModule());
Run Code Online (Sandbox Code Playgroud)

让杰克逊为你做转换.在内部,它使用LocalDateTime#parse标准格式之一.幸运的是,它支持像

2016-05-11T17:32:20.897
Run Code Online (Sandbox Code Playgroud)

盒子外面.

  • 谢谢,第二种方式对我来说更漂亮,我用`@JsonDeserialize`代替模块注册 (2认同)

Yan*_*ski 7

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

1)添加依赖项

compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.8"
Run Code Online (Sandbox Code Playgroud)

2)具有日期时间格式的Json注释

public class ClientRestObject {

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

}
Run Code Online (Sandbox Code Playgroud)

3)在ObjectMapper中注册Java8模块

private static ObjectMapper buildObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    //To parse LocalDateTime
    objectMapper.registerModule(new JavaTimeModule());
    return objectMapper;
}
Run Code Online (Sandbox Code Playgroud)

  • 遗憾的是它做了工作:(返回null (2认同)