我在尝试反序列化java对象时遇到了困难,因为对象中的字段(“info”)可以是两种可能的类型之一:ArrayList或String,以下是我到目前为止所做的:
首先,创建类基:
public class Base {
}
接下来创建子类:
public class GoodInfo extends Base {
public ArrayList<MyCustomObject> info;
}
public class BadInfo extends Base {
public String info;
}
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将再次反过来调用自定义反序列化器。
那么我该怎么做呢?
不,文件中写着(强调是我的):
...永远不要在传递JSON
的同一类型上调用它,因为这将导致无限循环...
只要类型不同,调用context.deserialize(...)
是完全可以的。
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);
}
public class Base {
public Object info;
}
问题内容: 确定,所以我编辑了问题,因为它不够清楚。 编辑2 :更新了JSON文件。 我在Android应用程序中使用GSON,我需要解析来自服务器的JSON文件,这些文件有点太复杂了。我不想让我的对象结构太沉重,所以我想简化内容: 所以我的对象的结构将不是JSON文件的结构。 例如,如果在JSON中,我有以下内容: 我不想保留我当前的对象结构,即一个对象,其中包含一个和一个“总计”。但是我只想将
问题内容: 我需要反序列化json,它是日期/长值的数组。这是返回的JSON的示例: 使用GSON,我可以将其反序列化为,但希望能够将其转换为类似以下内容的方法: 我似乎找不到一种方法来指示GSON将JSON映射的键/值映射到我的自定义类中的日期/值字段。有没有办法做到这一点,还是地图列表是唯一的路线? 问题答案: 您需要编写一个自定义解串器。您还需要使用可以实际解析的时区格式。无论是也将匹配,这
也许我跑错了方向,但我有一个元素列表,我想读。 我有一个抽象基类,让我们称之为: 现在我有两个可能的实现:
使用杰克逊( 数据: 数据模型: 我当前的反序列化器如下所示: 注意:我的问题被定义为Scala,但我认为Java的方法足够相似,以至于无关紧要。所以Java的答案是可以接受的。
问题内容: 我有一些奇怪的JSON,如: 基于某个字段,数组中的对象是某种类型。使用Gson,我的想法是要拥有一个TypeAdapterFactory,它将那些特定类型的委托适配器发送到TypeAdapter,但是我一直挂在理解读取“ type”字段以了解要创建哪种类型的一种好方法上。在TypeAdapter中 会假设“类型”字段在我的JSON中排在首位。有消除这种假设的不错方法吗? 问题答案:
我一辈子都想不出如何反序列化这一点: 到,其中PetPlayer包含一个名为“pets”的多映射,结构如下;。这里,PetType是枚举,Pet是一个抽象类,具有多个实现。 我尝试使用这两个序列化器和反序列化器。 我非常感谢任何帮助:)