在我正在使用的服务反序列化过程中使用的类中有以下字段。
private ZonedDateTime transactionDateTime;我正在使用的服务可能会使用模式: DateTime返回日期或yyyy-MM-dd'T'HH:mm:ss.SSSZ
让我举两个服务返回的例子:
虽然第一种方法运行良好,但后者导致在反序列化过程中引发以下异常:
java.time.format.DateTimeParseException:无法在索引23处解析“2015-11-18T00:00:00.000+0200”文本
我在用;
这需要自定义反序列化类吗?
发布于 2016-01-13 15:07:27
在前面的代码中,我使用了带有@JsonFormat注释的字段,但是删除了它,因为我认为它只用于序列化,就像JavaDocs建议的那样。
原来我需要添加那个注释。真正的问题是,第三方服务响应确实是错误的(它缺少XML中的包装器元素),这导致反序列化失败。错误是:
com.fasterxml.jackson.databind.JsonMappingException:不能实例化类型为简单类型的值,即从字符串值(‘2015-11-18T00:00:00.000+0200’)生成的类com.foo.bar.adapter.john.model.account.UserAccount;没有单个字符串构造函数/工厂方法。
该字段如下所示:
@JsonFormat(pattern = Constants.DATETIME_FORMAT)
@JacksonXmlProperty(localName = "transactionDate")
private ZonedDateTime transactionDateTime;此外,我还必须将@JsonRootName("transaction")添加到该字段的类中,因为对象被包装到集合中。
发布于 2018-08-30 08:11:00
默认情况下,杰克逊将反序列化为将时区传入UTC并使用ctx时区来重写它,所有ISO8601都将结束于UTC。
如果您是在春季,则可以关闭此功能。
spring.jackson.deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE=false发布于 2020-04-29 16:31:02
我用过
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
private ZonedDateTime startDate;当然还有jackson-datatype-jsr310库。
此解决方案在Jackson deserialize ISO8601 formatted date-time into Java8 Instant中描述。
https://stackoverflow.com/questions/34764355
复制相似问题