And*_*lko 18 java datetime json jackson deserialization
我有initiationDate按ToStringSerializerISO-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.LocalDateTime从Stringvalue('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扩展添加到你的类路径中并注册适当Module的ObjectMapper.
objectMapper.registerModule(new JavaTimeModule());
Run Code Online (Sandbox Code Playgroud)
让杰克逊为你做转换.在内部,它使用LocalDateTime#parse标准格式之一.幸运的是,它支持像
2016-05-11T17:32:20.897
Run Code Online (Sandbox Code Playgroud)
盒子外面.
对于那些想要解析自定义日期时间格式的人.
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)
| 归档时间: |
|
| 查看次数: |
22097 次 |
| 最近记录: |