【问题标题】:Jackson Joda Module deserialize ISO Date to Joda DateTimeJackson Joda 模块将 ISO 日期反序列化为 Joda DateTime
【发布时间】:2018-03-14 22:27:35
【问题描述】:

我正在使用 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 的本地时间如下:

"departureDate": "2017-10-03T00:00:00+01:00",

所以上面表示 10 月 3 日,+01 表示我们处于英国夏令时,比格林威治标准时间早 1 小时。

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

2017-10-02T23:00:00.000Z

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

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

目前我有一个香草 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);

【问题讨论】:

    标签: java spring datetime jackson jodatime


    【解决方案1】:

    默认情况下,反序列化时,Jackson 会将日期调整为 context timezone。在您的情况下,它会将其调整为 UTC(2017-10-03T00:00:00+01:00 相当于 2017-10-02T23:00:00.000Z - String 末尾的 ZUTC 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 将被反序列化为 Joda 的 DateTime,其值为 2017-10-03T00:00:00.000+01:00

    【讨论】:

    • 你刚刚拯救了相当多的脱发 :) 谢谢完美!
    猜你喜欢
    • 2013-09-25
    • 1970-01-01
    • 2011-08-07
    • 2015-06-20
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    相关资源
    最近更新 更多