gpt4 book ai didi

java - 为什么 Jackson 的默认解串器将 Zone 设置为 UTC 而不是 Z?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:02:30 25 4
gpt4 key购买 nike

我想我一定是误解了 Zones 在 java 的 ZonedDateTime 类中是如何工作的。当我使用 Jackson 序列化然后反序列化 now() 时,反序列化值具有 getZone() == "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 的反序列化过程中,Jackson 会将解析的时区调整为上下文提供的时区。您可以使用此设置修改此行为,以便解析的 ZonedDateTime 将保持在 Z:

objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);

更多详情 here

关于java - 为什么 Jackson 的默认解串器将 Zone 设置为 UTC 而不是 Z?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47478259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com