【发布时间】:2012-12-11 03:43:41
【问题描述】:
根据http://wiki.fasterxml.com/JacksonFAQDateHandling,“DateTime 可以自动序列化/反序列化,类似于处理 java.util.Date 的方式。”但是,我无法完成这个自动功能。有与此主题相关的 StackOverflow 讨论,但大多数都涉及基于代码的解决方案,但根据上面的引用,我应该能够通过简单的配置来完成此操作。
根据http://wiki.fasterxml.com/JacksonFAQDateHandling,我设置了我的配置,以便将日期写为时间戳是错误的。结果是 java.util.Date 类型被序列化为 ISO 8601 格式,但 org.joda.time.DateTime 类型被序列化为长对象表示。
我的环境是这样的:
杰克逊 2.1
乔达时间 2.1
春季 3.2
Java 1.6
我的 jsonMapper bean 的 Spring 配置是
@Bean
public ObjectMapper jsonMapper() {
ObjectMapper objectMapper = new ObjectMapper();
//Fully qualified path shows I am using latest enum
ObjectMapper.configure(com.fasterxml.jackson.databind.SerializationFeature.
WRITE_DATES_AS_TIMESTAMPS , false);
return objectMapper;
}
我的测试代码sn-p是这样的
Date d = new Date();
DateTime dt = new DateTime(d); //Joda time
Map<String, Object> link = new LinkedHashMap<String, Object>();
link.put("date", d);
link.put("createdDateTime", dt);
JSON 输出的结果 sn-p 是这样的:
{"date":"2012-12-24T21:20:47.668+0000"}
{"createdDateTime": {"year":2012,"dayOfMonth":24,"dayOfWeek":1,"era":1,"dayOfYear":359,"centuryOfEra":20,"yearOfEra":2012,"yearOfCentury":12,"weekyear":2012,"monthOfYear":12 *... remainder snipped for brevity*}}
我的期望是 DateTime 对象应该与基于配置的 Date 对象匹配。我做错了什么,或者我误解了什么?我是不是对 Jackson 文档中的 automatically 这个词读得太多了,而事实上,虽然不是 ISO 8601,但产生了一个字符串表示,正在产生广告中的自动功能?
【问题讨论】:
-
这似乎已经解决了,但值得指出的是,自动日期支持是指 JDK 中包含的类型——Jackson 默认不支持外部日期库(如 Joda)的日期类型。通过扩展模块添加支持(对于 Joda,通过 github.com/FasterXML/jackson-datatype-joda)
-
@StaxMan,我绝对同意。作为 Jackson 的新手,FAQ 中的“DateTime 可以自动 序列化/反序列化,类似于处理 java.util.Date 的方式”声明让我相信这是核心功能。当我发布到 Jackson 用户邮件列表时,有人将我引导到您提到的 github 项目链接,在使用说明中我发现需要处理 JodaModule(通过 jackson-datatype-joda 项目提供) Joda DateTime 并且该模块必须向 ObjectMapper 注册,如答案所示。
-
好的,我将更新该 Wiki 页面,说明对 Jackson 2.x 的支持与 1.x 不同。谢谢!
-
基于代码的解决方案在哪里??
标签: json spring jackson jodatime