gpt4 book ai didi

java - 为什么 GSON 在自定义 TypeAdapter 处为枚举生成不同的 JSON?

转载 作者:太空宇宙 更新时间:2023-11-04 06:49:04 26 4
gpt4 key购买 nike

我为包含枚举属性的类编写了一个TypeAdapter。这是 write 方法,它对枚举值使用标准 GSON 序列化:

    @Override
public void write(JsonWriter writer, MyClass object) throws IOException {
if (object == null) {
writer.nullValue();
return;
}
writer.beginObject();
writer.name("type").value(gson.toJson(object.getType())); //this is the enum
writer.endObject();
}

使用此 TypeAdapter 时,生成的 JSON 包含枚举的这一部分:

"type":"\"ENUM_VALUE\""

但是当我在包含此枚举但没有 TypeAdapter 的类上使用 gson.toJson(object) 时,它会生成:

"type":"ENUM_VALUE"

所有Gson对象都使用标准配置。无论我直接测试 TypeAdapter 还是使用 Gson 并注册它,它都会在第一个版本中产生相同的结果。

为什么会有差异?我想这里不需要逃避,所以我想避免它。有趣的是,反序列化适用于使用 TypeAdapter(使用 gson.fromJson(reader.nextString()))的两个序列化版本。

我猜这个问题可能会发生,因为 gson.toJson(object.getType()) 已经产生了引号:"ENUM_VALUE",并且当使用 writer.value(gson.toJson(object.getType()) 将它们添加到 JsonWriter 时,它会被转义。但是如何正确处理这个问题,就像 GSON 那样?

最佳答案

就是你的TypeAdapter是错的。将其替换为:

public void write(JsonWriter writer, MyClass object) throws IOException {
if (object == null) {
writer.nullValue();
return;
}
writer.beginObject();
writer.name("type").value(object.getType().toString()); //this is the enum
writer.endObject();
}

在代码中,您通过执行 JSON 序列化的枚举创建一个字符串。这会产生 "ENUM_VALUE" ( gson.toJson(object.getType()) ),然后再次序列化为字符串,结果为 \"ENUM_VALUE\"

在我的代码中,我使用 toString() 获取枚举的字符串表示形式方法,因此不会创建额外的引号。

关于java - 为什么 GSON 在自定义 TypeAdapter 处为枚举生成不同的 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23583331/

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