如何在Gson中创建自定义列表反序列化器?

10
我需要反序列化一个包含数组的Json文件。我知道如何将它反序列化为List对象,但在我使用的框架中,我使用了一个自定义列表对象,该对象没有实现Java List接口。我的问题是,如何为我的自定义列表对象编写反序列化器?
编辑:我希望这个反序列化器是通用的,也就是说我希望它适用于所有类型的列表,比如 CustomList,CustomList,CustomList,而不是只适用于特定类型的列表,因为这样每种类型都要创建一个反序列化器会很麻烦。

2
为什么不先使用Java类对其进行反序列化,然后编写自己的转换器来转换为自定义列表对象呢? - Reaz Murshed
请看这个 - user7346816
@ReazMurshed 我可以这样做,但我正在将其反序列化为对象模型,然后在我的代码的其余部分中使用它。我可以创建一个ModelJson类和一个Model类,其中ModelJson类使用Java的List接口仅用于反序列化,之后转换为Model类。问题是我有很多这样的类,所以有点麻烦,而且我很好奇是否有更优雅的解决方案。如果没有,我将走下硬编码的道路,但我希望不必这样做。 - BananyaDev
@SzymonD,那个答案的问题在于我需要为我的列表制作一个通用的反序列化器。我需要它能够反序列化任何类型的列表,例如CustomList<Integer>,CustomList<String>,CustomList<CustomModel>等等。在你给出的答案中,OP确切地知道他需要反序列化的数据类型。我知道如何反序列化自定义模型,我只是好奇如何为自定义列表做到这一点,如果可能的话。 - BananyaDev
1个回答

5
这是我想到的方案:
class CustomListConverter implements JsonDeserializer<CustomList<?>> {
    public CustomList deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext ctx) {
        Type valueType = ((ParameterizedType) typeOfT).getActualTypeArguments()[0];

        CustomList<Object> list = new CustomList<Object>();
        for (JsonElement item : json.getAsJsonArray()) {
            list.add(ctx.deserialize(item, valueType));
        }
        return list;
    }
}

像这样注册:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(CustomList.class, new CustomListConverter())
        .create();

感谢您提供的 valueType,我之前一直无法得到正确的类型,直到看到了您的答案! - Luka Govedič

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接