首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Jackson的默认反序列化器将区域设置为UTC而不是Z?

为什么Jackson的默认反序列化器将区域设置为UTC而不是Z?
EN

Stack Overflow用户
提问于 2017-11-24 18:07:48
回答 2查看 4.7K关注 0票数 6

我想我一定是误解了java的ZonedDateTime类中区域是如何工作的。当我使用Jackson序列化然后反序列化now()时,反序列化值具有getZone() == "UTC“,而不是序列化值中的"Z”。有人能向我解释这是为什么,以及我应该做什么吗?

下面的代码打印:

代码语言:javascript
复制
{"t":"2017-11-24T18:00:08.425Z"}
Data [t=2017-11-24T18:00:08.425Z]
Data [t=2017-11-24T18:00:08.425Z[UTC]]
Z
UTC

java源:

代码语言:javascript
复制
<!-- language: java -->

package model;

import static org.junit.Assert.*;

import java.io.IOException;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

import org.junit.Test;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class ZonedDateTimeSerializationTest {

    static public class Data {
        @Override
        public String toString() {
            return "Data [t=" + t + "]";
        }

        public ZonedDateTime getT() {
            return t;
        }

        public void setT(ZonedDateTime t) {
            this.t = t;
        }

        ZonedDateTime t = ZonedDateTime.now(ZoneOffset.UTC);
    };

    @Test
    public void testDeSer() throws IOException {
        Data d = new Data();
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.findAndRegisterModules();
        String serialized = objectMapper.writer()
                .without(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                .writeValueAsString(d);
        System.out.println(serialized);

        Data d2 = objectMapper.readValue(serialized, Data.class);
        System.out.println(d);
        System.out.println(d2);
        System.out.println(d.getT().getZone());
        System.out.println(d2.getT().getZone());

        // this fails
        assertEquals(d, d2);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-26 18:35:28

默认情况下,在反序列化ZonedDateTime期间,Jackson将将解析的时区调整为上下文提供的时区。可以使用此设置修改此行为,以便解析的ZonedDateTime将停留在Z上。

代码语言:javascript
复制
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);

更多细节这里

票数 8
EN

Stack Overflow用户

发布于 2020-05-05 20:15:39

我这样做实际上是为了保存时区:

代码语言:javascript
复制
mapper.enable(SerializationFeature.WRITE_DATES_WITH_ZONE_ID)
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47478259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档