如何在Java8 LocalDateTime中使用Jackson映射器?
org.codehaus.jackson.map.JsonMappingException:不能实例化来自JSON字符串的简单类型、类java.time.LocalDateTime的值;没有单字符串构造函数/工厂方法(通过引用链: MyDTO"field1"->SubDTO"date")
发布于 2015-01-14 21:12:14
这里不需要使用自定义序列化器/反序列化器。使用jackson-模块-java8 8的日期时间模块
Datatype模块,使Jackson能够识别Java 8日期和时间API数据类型(JSR-310)。
发布于 2015-01-14 21:08:29
更新:出于历史原因离开这个答案,但我不推荐它。请参阅上述已获接纳的答案。
告诉Jackson使用自定义反序列化类映射:
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime ignoreUntil;提供自定义类:
public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException {
arg1.writeString(arg0.toString());
}
}
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser arg0, DeserializationContext arg1) throws IOException {
return LocalDateTime.parse(arg0.getText());
}
}随机事实:如果我嵌套上面的类而不使它们是静态的,错误消息是奇怪的:org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
发布于 2016-05-28 13:04:20
如果您使用的是快速you的ObjectMapper类,默认情况下,ObjectMapper不理解LocalDateTime类,因此需要在gradle/maven中添加另一个依赖项:
compile 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.7.3'现在您需要将这个库提供的数据类型支持注册到objectmapper对象中,这可以通过以下方法实现:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();现在,在您的jsonString中,您可以轻松地将您的java.LocalDateTime字段放在下面的位置:
{
"user_id": 1,
"score": 9,
"date_time": "2016-05-28T17:39:44.937"
}通过这样做,您的Json文件到Java对象的转换将正常工作,您可以通过以下方式读取该文件:
objectMapper.readValue(jsonString, new TypeReference<List<User>>() {
});https://stackoverflow.com/questions/27952472
复制相似问题