在下面的JSON中,你会看到有很多对象都有一个'groups'子对象(这些对象看起来都是一样的),并且那些组有一个名为'items'的子对象(这些是不同的取决于在集团的父母身上)。
我的问题:
是否可以将1'组'类添加到多个对象中,但仍然可以通过GSON解析正确的'items'类?
可能是这样的:
public List<Item<T>> items
不确定如何解决这个问题并试图避免编写大量冗余的“组”类。
提前致谢!
粘贴JSON字符串会让我超过字符限制,所以我将它贴在了pastebin上。你可以找到它by clicking here
答案 0 :(得分:1)
您尝试反序列化的JSON问题在于它包含groups
项的混合元素,因此不可能只编写POJO来适应该结构。
事实上,你在某个时候会有这样一个领域:
ArrayList<Group> groups;
但Group
可以在列表中更改项目之间的实际类型,因此您现在可以做的是构建一个普通的父GenericGroup<T>
类,如下所示:
public class GenericGroup<T> {
String type;
String name;
ArrayList<T> items;
public ArrayList<T> getItems(){
return items;
}
public static class SomeGroup extends GenericGroup<SomeItem>{}
public static class SomeOtherGroup extends GenericGroup<SomeOtherItem>{}
}
完成此操作后,您应该为JSON字段输入POJO模型:
ArrayList<GenericGroup> groups;
现在您已准备好创建所需类型的项目,如:
public class SomeItemType{
String someAttribute;
String someOtherAttribute;
...
}
现在出现了疯狂的部分,您需要为GenericGroup类编写自定义GSON反序列化器:
public class GenericGroupDeserializer implements JsonDeserializer<GenericGroup> {
@Override
public GenericGroup deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
String type = json.getAsJsonObject().get("type").getAsString();
switch (type){
case "someType":
return new Gson().fromJson(json.toString(), GenericGroup.SomeGroup.class);
case "someOtherType":
return new Gson().fromJson(json.toString(), GenericGroup.SomeOtherGroup.class);
default:
return new GenericGroup();
}
}
}
最后,在你的MainActivity中写下这样的东西:
private Gson mGson = new GsonBuilder()
.registerTypeHierarchyAdapter(GenericGroup.class, new GenericGroupDeserializer()).create();