我使用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);
答案 0 :(得分:4)
在反序列化时,默认情况下,杰克逊会将日期调整为context timezone。在您的情况下,它会将其调整为UTC(2017-10-03T00:00:00+01:00
相当于2017-10-02T23:00:00.000Z
- Z
末尾的String
是UTC 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
。