如何使用Gson解析列表列表

丹尼丁

我有一个看起来像这样的JSON:

{
     "1": [{"id": 1}, {"id": 2},{"id": 3}, {"id": 4}],
     "2": [{"id": 5}, {"id": 6}],
     "3": [{"id": 3}, {"id": 4}]
}

我希望将其解析为

List<List<Integer>> list

或者

Map<Integer, List<Integer>> map

我应该如何使用Gson来实现这一目标?

柳博米尔·谢达里夫(Lyubomyr Shaydariv)

您至少有两个选择:命令式和Gson式。

在命令式选项中,您可以使用Gson工具简单地逐步解析给定JSON的整个JSON树:

final Gson gson = new GsonBuilder()
        // any custom Gson configuration here
        .create();
final Map<Integer, List<Integer>> map = new LinkedHashMap<>();
for ( final Entry<String, JsonElement> e : gson.fromJson(JSON, JsonElement.class).getAsJsonObject().entrySet() ) {
    // parseInt() ignores additional type adapters in Gson
    final Integer key = gson.fromJson(e.getKey(), Integer.class);
    final List<Integer> list = new ArrayList<>();
    @SuppressWarnings({ "unchecked", "rawtypes" })
    final Iterable<JsonObject> asJsonArray = (Iterable) e.getValue().getAsJsonArray();
    for ( final JsonObject el : asJsonArray ) {
        final Integer integer = gson.fromJson(el.get("id"), Integer.class);
        list.add(integer);
    }
    map.put(key, list);
}
out.println(map);

有点脏,不是吗?输出:

{1 = [1、2、3、4],2 = [5、6],3 = [3、4]}

一种替代方法是制作一个自定义的伪造的DTO,该伪造的DTO将成为GsonTypeToken特殊标记,以便更精确地绑定JSON反序列化。例如:

abstract class FakeInt {

    private FakeInt() {
        throw new AssertionError("Not meant to be instantiated");
    }

}

这是一个带有私有构造函数的抽象类,该类抛出错误,因此无法在外部实例化。它永远不会,它只是一个标记。

final class FakeIntDeserializer
        implements JsonDeserializer<Integer> {

    private static final JsonDeserializer<Integer> fakeIntDeserializer = new FakeIntDeserializer();

    private FakeIntDeserializer() {
    }

    static JsonDeserializer<Integer> getFakeIntDeserializer() {
        return fakeIntDeserializer;
    }

    @Override
    public Integer deserialize(final JsonElement json, final Type type, final JsonDeserializationContext context) {
        final JsonElement idElement = json.getAsJsonObject().get("id");
        return context.deserialize(idElement, Integer.class);
    }

}

该反序列化程序知道具有该id属性的JSON数组元素:从父对象获得该属性后,将idElement其委托给下游解析器以提取Integer值。尽管可以使用idElement.getAsInt(),但idElement为了尊重整个Gson配置而委托Integer该类(您可以为该类设置特殊规则)。以及伪造的DTO类及其JSON反序列化器如何一起工作:

final Type integerToFakeIntListType = new TypeToken<Map<Integer, List<FakeInt>>>() {
}.getType();
final Gson gson = new GsonBuilder()
        .registerTypeAdapter(FakeInt.class, getFakeIntDeserializer())
        .create();
final Map<Integer, List<Integer>> map = gson.fromJson(JSON, integerToFakeIntListType);
out.println(map);

请注意,Gson实例是通过某种技巧或欺骗来构建的:FakeInt该类已绑定到只能返回Integer值或的自定义反序列化器null一旦绑定了类型及其反序列化器,Gson就可以使用实例了,并且可以像解析一个整数到整数列表一样对给定的JSON进行解析完全相同的输出如下:

{1 = [1、2、3、4],2 = [5、6],3 = [3、4]}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Volley和Gson:解析项目和项目列表

来自分类Dev

如何使用Groovy对列表列表进行分组

来自分类Dev

使用LINQ如何使用元素索引转换列表列表

来自分类Dev

使用Gson解析不同的JSON对象的列表

来自分类Dev

在Java中使用GSON解析JSON并填充列表视图

来自分类Dev

如何合并列表列表

来自分类Dev

如何使用Scala从列表列表创建列表?

来自分类Dev

创建和使用列表列表列表:在Python中

来自分类Dev

如何使用流减少保留所有列表列表

来自分类Dev

如何使用python旋转此列表列表

来自分类Dev

如何使用Retrofit和GSON解析[]包围的JSON对象列表?

来自分类Dev

如何选择列表列

来自分类Dev

如何使用列表列表调用itertools.pruduct函数

来自分类Dev

如何使用sql查询对列表列表进行排序?

来自分类Dev

如何使用Retrofit和Gson解析嵌套列表?

来自分类Dev

如何使用Linq对列表列表进行分组和求和

来自分类Dev

如何根据列表绘制列表列表?

来自分类Dev

如何遍历列表列表列表列表列表... Python中的坐标对列表列表?

来自分类Dev

使用列表列表过滤列表列表

来自分类Dev

使用Gson解析列表对象json

来自分类Dev

创建和使用列表列表列表:在Python中

来自分类Dev

如何形成列表列表?

来自分类Dev

如何压缩列表列表

来自分类Dev

如何替换列表(列表列表)中的列表内的元素?

来自分类Dev

使用 Gson 反序列化具有多种类型的列表列表

来自分类Dev

将数据解析为列表列表

来自分类Dev

使用 GSON 解析 json 字符串列表

来自分类Dev

如何使用 RecyclerView 和 GridLayoutManager 制作列表列表

来自分类Dev

如何使用列表列表发布表单数据?

Related 相关文章

热门标签

归档