GSON - 1个父母,多个孩子

时间:2015-09-03 13:30:46

标签: java android json gson

在下面的JSON中,你会看到有很多对象都有一个'groups'子对象(这些对象看起来都是一样的),并且那些组有一个名为'items'的子对象(这些是不同的取决于在集团的父母身上)。

我的问题:

是否可以将1'组'类添加到多个对象中,但仍然可以通过GSON解析正确的'items'类?

可能是这样的:

public List<Item<T>> items

不确定如何解决这个问题并试图避免编写大量冗余的“组”类。

提前致谢!

粘贴JSON字符串会让我超过字符限制,所以我将它贴在了pastebin上。你可以找到它by clicking here

1 个答案:

答案 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();