我有字段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包含在项目中并将@JsonDeserialize
与LocalDateTimeDeserializer
一起使用,问题已得到解决。
@JsonSerialize(using = ToStringSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime initiationDate;
答案 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;
}