LocalDateTime - 使用 LocalDateTime.parse 反序列化
Posted
技术标签:
【中文标题】LocalDateTime - 使用 LocalDateTime.parse 反序列化【英文标题】:LocalDateTime - deserialization with LocalDateTime.parse 【发布时间】:2016-09-07 01:35:15 【问题描述】:我有 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
结束:
无法从
String
值('2016-05-11T17:32:20.897'
)实例化类型[简单类型,类java.time.LocalDateTime
]的值;没有单String
构造函数/工厂方法
我如何做到这一点?如何指定工厂方法?
编辑:
问题已通过将jackson-datatype-jsr310 module 包含到项目中并将@JsonDeserialize
与LocalDateTimeDeserializer
一起使用来解决。
@JsonSerialize(using = ToStringSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime initiationDate;
【问题讨论】:
我不知道它使用parse
,但是你添加了适当的扩展,here?
@SotiriosDelimanolis,不,它如何解决我的问题?我需要指定工厂方法。 LocalDateTime.parse("2016-05-11T17:32:20.897")
工作正常。
【参考方案1】:
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's java.time
extension 添加到您的类路径中,并使用您的ObjectMapper
注册适当的Module
。
objectMapper.registerModule(new JavaTimeModule());
让 Jackson 为您完成转换。在内部,它使用LocalDateTime#parse
和其中一种标准格式。幸运的是,它支持像
2016-05-11T17:32:20.897
开箱即用。
【讨论】:
谢谢,第二种方式对我来说更漂亮,我用@JsonDeserialize
代替了模块注册
是的,我也采用了第二种方式:objectMapper.registerModule(new JavaTimeModule());。我投了赞成票。【参考方案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;
【讨论】:
@András 你是说当你发出一个帖子请求时,你的 ClientRestObject 中的 LocalDateTime 是空的吗?我遇到了同样的问题,想知道您是如何解决的。 可能迟到了,但请在此处查看接受的答案:***.com/questions/40327970/…以上是关于LocalDateTime - 使用 LocalDateTime.parse 反序列化的主要内容,如果未能解决你的问题,请参考以下文章