gpt4 book ai didi

java - 为什么gson在序列化java.time.ZoneId的时候要找java.time.ZoneRegion?

转载 作者:行者123 更新时间:2023-12-05 04:19:10 25 4
gpt4 key购买 nike

我想了解 Gson 在这里做什么。

这是我的简单测试用例。

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import org.junit.Test;

import java.io.IOException;
import java.time.ZoneId;

public class TestSuite
{
public class TestItem
{
private ZoneId TimeZone = ZoneId.of("America/New_York");
}

class ZoneIdAdapter extends TypeAdapter<ZoneId>
{
@Override
public void write(final JsonWriter jsonWriter, final ZoneId timeZone) throws IOException
{
jsonWriter.value(timeZone.getId());
}

@Override
public ZoneId read(final JsonReader jsonReader) throws IOException
{
return ZoneId.of(jsonReader.nextString());
}
}

@Test
public void canSerializeTestItem()
{
Gson gson = new GsonBuilder()
.registerTypeAdapter(ZoneId.class, new ZoneIdAdapter())
.create();

gson.toJson(new TestItem());
}
}

对我来说,使用 Java 17 和 Gson 2.10 失败并显示以下内容:

com.google.gson.JsonIOException: Failed making field 'java.time.ZoneRegion#id' accessible; either increase its visibility or write a custom TypeAdapter for its declaring type.

我不明白为什么 gson 关注 java.time.ZoneRegion#id 当我想*我已经告诉它如何序列化一个 ZoneId (我猜 ZoneRegion 是 java.time.ZoneId 的内部对象?我似乎找不到它。)。

更让我困惑的是,如果我更改为以下内容:

public class TestItem
{
@Expose
private ZoneId timeZone = ZoneId.of("America/New_York");
}

// ... omitted other stuff

Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.registerTypeAdapter(ZoneId.class, new ZoneIdAdapter())
.create();

gson.toJson(new TestItem());

然后它会像我预期的那样工作(不会出错)。

有没有更好的方法来“教”gson 如何序列化我关注的第三方类型?

最佳答案

ZoneId.of() 返回的实际具体类型是一个ZoneRegion,而registerTypeAdapter 只为单一类型注册一个适配器。

由于 ZoneRegion 不是公共(public)类,您不能(轻松地)为它注册一个适配器——当然您需要一个即使您有一个 实例也能正常工作的配置TestItem,其中 timeZone 具有不同的具体类型。

您可以改用 registerTypeHierarchyAdapter。这会为一个类及其所有子类注册一个适配器。

我不知道为什么 @Expose 会改变行为。

关于java - 为什么gson在序列化java.time.ZoneId的时候要找java.time.ZoneRegion?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74924830/

25 4 0
文章推荐: javascript - 如何从其IP地址识别向量是否是公司?
文章推荐: c# - 将字节数组保存为 Pgn 或 Jpg
文章推荐: python - 如何将所有列相互相乘
文章推荐: c# - 为什么 C# Func 不能赋值给 Func