首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ZonedDateTime的Jackson反序列化问题

ZonedDateTime的Jackson反序列化问题
EN

Stack Overflow用户
提问于 2016-01-13 10:34:56
回答 4查看 30.9K关注 0票数 10

在我正在使用的服务反序列化过程中使用的类中有以下字段。

代码语言:javascript
运行
复制
private ZonedDateTime transactionDateTime;

我正在使用的服务可能会使用模式: DateTime返回日期或yyyy-MM-dd'T'HH:mm:ss.SSSZ

让我举两个服务返回的例子:

  • 2015年-11-18T18:05:38.000+0200
  • 2015年-11-18T00:00:00.000+0200

虽然第一种方法运行良好,但后者导致在反序列化过程中引发以下异常:

java.time.format.DateTimeParseException:无法在索引23处解析“2015-11-18T00:00:00.000+0200”文本

我在用;

  • 弹簧启动1.3.1
  • 杰克逊2.6.4 (包括JSR310模块)

这需要自定义反序列化类吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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;没有单个字符串构造函数/工厂方法。

该字段如下所示:

代码语言:javascript
运行
复制
@JsonFormat(pattern = Constants.DATETIME_FORMAT)
@JacksonXmlProperty(localName = "transactionDate")
private ZonedDateTime transactionDateTime;

此外,我还必须将@JsonRootName("transaction")添加到该字段的类中,因为对象被包装到集合中。

票数 4
EN

Stack Overflow用户

发布于 2018-08-30 08:11:00

默认情况下,杰克逊将反序列化为将时区传入UTC并使用ctx时区来重写它,所有ISO8601都将结束于UTC。

如果您是在春季,则可以关闭此功能。

代码语言:javascript
运行
复制
spring.jackson.deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE=false
票数 5
EN

Stack Overflow用户

发布于 2020-04-29 16:31:02

我用过

代码语言:javascript
运行
复制
@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中描述。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34764355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档