为什么杰克逊的默认反序列化程序将区域设置为 UTC 而不是 Z?



我认为我必须误解区域在Java的Zoneddatetime类中的工作方式。当我使用Jackson序列化然后NOW NOW()时序列化时,值得序列化的值()==" UTC"而不是序列化值中的" Z"。谁能向我解释为什么这是什么,我应该做什么?

下面的代码打印:

{"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来源:

<!-- 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);
    }
}

默认情况下,在ZonedDateTime的避免序列化期间,杰克逊会将解析的时区调整为上下文提供的时区。您可以通过此设置修改此行为,以便分解的ZonedDateTime将停留在Z

objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);

更多详细信息

我这样做是为了保留时区:

mapper.enable(SerializationFeature.WRITE_DATES_WITH_ZONE_ID)
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)

最新更新