杰克逊在反序列化到JodaTime时失去了与日期相关的时间

Vys*_*rat 7 java json jodatime jackson

我正在尝试使用Jackson序列化然后反序列化Joda DateTime对象,但它不会完全反序列化该对象.看起来时区信息丢失了.

这段代码:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());
mapper.configure(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS , false);

DateTime dt = DateTime.now();
String j = mapper.writeValueAsString(dt);
DateTime dt2 = mapper.readValue(j, DateTime.class);

System.out.println("json: " + j);
System.out.println("eq? " + (dt.equals(dt2)));
System.out.println("dates:\n" + dt + "\n" + dt2);
Run Code Online (Sandbox Code Playgroud)

输出:

json: "2013-10-18T14:10:52.458-07:00"
eq? false
dates:
2013-10-18T14:10:52.458-07:00
2013-10-18T21:10:52.458Z
Run Code Online (Sandbox Code Playgroud)

这是设计的吗?除了编写自己的序列化器/解串器之外,还有什么我可以做的吗?我在SO上看到了一些关于这个的问题,但没有一个具体涉及这方面.

我正在使用Joda 2.1和Jackson 2.1

Vik*_*eev 7

是的,这是设计的.JodaTime DateTimeSerializer使用标准的toString()方法.根据JodaTime官方指南 toString()返回 - DateTime的标准ISO8601字符串.此外,标准DateTimeDeserializer始终创建UTC日期时间.

要存储TimeZone,您需要.withZone()在反序列化后使用相同的json和use 方法单独存储它,或者只创建序列化器和反序列化器.

UPDATE

版本2.2.3有一些扩展的行为 - DateTimeDeserializer创建DateTime,其中timeZone取自DeserializationContext.它可能会改变ObjectMapper.setTimeZone().默认是TimeZone.getTimeZone("GMT")

  • 你真的试图联系模块的作者,提供你的帮助,而不是抱怨吗?在SO处抱怨并不是一种与OSS项目合作的高效方式. (2认同)

Kai*_*itz 7

必须告诉杰克逊不要通过以下方式将时区调整为当地环境的时区:

mapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
Run Code Online (Sandbox Code Playgroud)

在GitHub上看到这个问题