【发布时间】:2025-11-22 05:30:02
【问题描述】:
我在尝试反序列化 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,它是 Base 对象的 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 将再次调用自定义反序列化器。
那么我该怎么做呢?
【问题讨论】:
标签: java json serialization gson