Jackson Joda模块将ISO日期反序列化为Joda DateTime

时间:2017-10-03 16:36:12

标签: java spring datetime jackson jodatime

我使用Spring从Web API rest API检索JSON数据,使用Jackson Joda模块反序列化ISO日期,并将其转换为Joda DateTime

春天请求:

HttpEntity<?> httpEntity = new HttpEntity<>(headers);
    final ResponseEntity<returnedEntities> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, EntitiesList.class);

实体的属性是Joda DateTime

/**
 *
 * @return
 * The departureDate
 */
@JsonProperty("departureDate")
public DateTime getDepartureDate() {
    return departureDate;
}

/**
 *
 * @param departureDate
 * The departureDate
 */
@JsonProperty("departureDate")
public void setDepartureDate(DateTime departureDate) {
    this.departureDate = departureDate;
}

我的问题是服务器返回JSON的本地时间如下:

  

&#34; departureDate&#34;:&#34; 2017-10-03T00:00:00 + 01:00&#34;,

所以上面代表10月3日+01代表我们在英国夏令时比格林尼治标准时间提前1小时。

现在Jackson JSON模块似乎正在剥离时区信息,有效地将时间转换为GMT日期时间。 所以Joda DateTime返回的是:

  

2017-10-02T23:00:00.000Z

10月2日晚上11点,这是错误的日期。

在将Json转换为Joda +1:00时,如何让Jackson Joda模块存储DateTime时区需要做什么?

目前我有一个香草Joda模块:

JodaModule jodaModule = new JodaModule();
jsonConverter.getObjectMapper().registerModule(jodaModule);
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = mappingJackson2HttpMessageConverter.getObjectMapper();
objectMapper.registerModule(jodaModule);

MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = mappingJackson2HttpMessageConverter.getObjectMapper();
objectMapper.registerModule(jodaModule);

objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);           
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
listHttpMessageConverters.add(mappingJackson2HttpMessageConverter);
restTemplate.setMessageConverters(listHttpMessageConverters);

1 个答案:

答案 0 :(得分:4)

在反序列化时,默认情况下,杰克逊会将日期调整为context timezone。在您的情况下,它会将其调整为UTC(2017-10-03T00:00:00+01:00相当于2017-10-02T23:00:00.000Z - Z末尾的StringUTC designator })。

为避免这种情况并保留输入的时区,您可以停用ADJUST_DATES_TO_CONTEXT_TIME_ZONE feature

objectMapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

有了这个,String之类的输入2017-10-03T00:00:00+01:00将被反序列化为价值为DateTime的Joda 2017-10-03T00:00:00.000+01:00