【发布时间】:2017-07-03 10:34:45
【问题描述】:
我在 Spring Boot 应用程序中使用了一个 Java 类来反序列化来自具有如下字段的请求的 json 对象:
@JsonFormat(pattern="yyyy-MM-dd'T'HH:mm:ss[.SSS]XXX", timezone = "UTC")
Instant timestamp;
它使用 Jackson V2.6.6 @JsonFormat 注释来反序列化来自网络的 JSON 中的“时间戳”字段。
我看到的是,当值类似于:
“2017-01-09T21:49:26.70Z”
没有问题。
但是,如果该值包含单个小数位第二个小数位,或者多于三个,例如:
“2017-01-09T21:49:26.7Z”或“2017-01-09T21:49:26.7000Z”
然后我会得到以下错误:
Caused by: java.time.format.DateTimeParseException: Text '2017-01-09T21:49:26.7Z' could not be parsed at index 19
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) ~[?:1.8.0_65]
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1777) ~[?:1.8.0_65]
at com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer.deserialize(InstantDeserializer.java:150) ~[jackson-datatype-jsr310-2.6.6.jar:2.6.6]
at com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer.deserialize(InstantDeserializer.java:45) ~[jackson-datatype-jsr310-2.6.6.jar:2.6.6]
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:520) ~[jackson-databind-2.6.6.jar:2.6.6]
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:101) ~[jackson-databind-2.6.6.jar:2.6.6]
at com.fasterxml.jackson.module.afterburner.deser.SuperSonicBeanDeserializer.deserialize(SuperSonicBeanDeserializer.java:156) ~[jackson-module-afterburner-2.6.6.jar:2.6.6]
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3736) ~[jackson-databind-2.6.6.jar:2.6.6]
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2764) ~[jackson-databind-2.6.6.jar:2.6.6]
我可以做些什么来修复这个模式,以便它可以灵活地接受小数点后的小数位数?我知道Java日期格式中有一个宽松的概念:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
但我不确定如何将对象映射器设置为宽松模式。
【问题讨论】:
-
如果没有任何效果,您可以将其读取为
String并使用正则表达式对其进行解析
标签: java parsing datetime jackson deserialization