gpt4 book ai didi

java - 如何为具有两种可能类型的嵌入式对象编写 GSON 自定义解串器

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:41 24 4
gpt4 key购买 nike

我在尝试反序列化 Java 对象时遇到问题,因为对象内的字段(“信息”)可以是两种可能类型之一:ArrayList 或只是一个 String。这是我到目前为止所做的:

首先,创建类Base:

public class Base {
}

接下来创建子类:

public class GoodInfo extends Base {
public ArrayList<MyCustomObject> info;
}

public class BadInfo extends Base {
public String info;
}

所以现在我想解析我的 JSON,它是一个基本对象的 ArrayList(即一个对象的 ArrayList,其中每个对象是一个 ArrayList 或一个字符串):

Type listOfBase = new TypeToken<ArrayList<Base>>(){}.getType();
ArrayList<Base> resp=gson.fromJson(jsonText, listOfBase);

我知道要让它工作,我必须编写一个自定义反序列化器。反序列化器如下所示:

private class MyCustomDeserializer implements JsonDeserializer<DateTime> {
public Base deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
// WHAT DO I DO HERE?
}
}

如您所见,我不知道如何尝试反序列化每个子类型并返回有效的类型。有人知道怎么做吗?

我认为它看起来像这样:

private class MyCustomDeserializer implements JsonDeserializer<DateTime> {
public Base deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
try {
GoodInfo goodInfo=SOMEHOW TRY TO DESERIALIZE json INTO A GoodInfo object
return goodInfo;
} catch {
//
}
try {
BadInfo badInfo=SOMEHOW TRY TO DESERIALIZE json INTO A BadInfo object
return badInfo;
} catch {
throw new JsonParseException("Could not deserialize");
}
}
}

根据 GSON,我不能对传入的 json 使用 context.deserialize:对指定对象调用默认反序列化。它永远不应在作为 JsonDeserializer.deserialize(JsonElement, Type, JsonDeserializationContext) 方法的参数接收的元素上调用。这样做将导致无限循环,因为 Gson 将依次再次调用自定义反序列化器。

那我该怎么做呢?

最佳答案

没有documentation reads (强调我的):

...you should never invoke it on the same type passing json since that will cause an infinite loop...

只要类型不同,就可以调用 context.deserialize(...)

您可以使用 json 检查 info 字段并根据元素类型采取适当的操作,而不是在反序列化器中捕获异常,例如:

public Base deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
final JsonElement elem = json.getAsJsonObject()
.get("info");
if (elem.isJsonArray()) {
return context.deserialize(json, GoodInfo.class);
}
return context.deserialize(json, BadInfo.class);
}

或者,您可以通过修改父类(super class)来完全绕过自定义 JsonDeserializer。提取 info 字段作为 Object,例如:

public class Base {
public Object info;
}

将允许 Gson 适本地反序列化该值。

关于java - 如何为具有两种可能类型的嵌入式对象编写 GSON 自定义解串器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27612377/

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