是否可以使用 Gson.fromJson() 来获取 ArrayList<ArrayList<String>>?

Posted

技术标签:

【中文标题】是否可以使用 Gson.fromJson() 来获取 ArrayList<ArrayList<String>>?【英文标题】:is it possible to use Gson.fromJson() to get ArrayList<ArrayList<String>>? 【发布时间】:2014-04-11 21:08:01 【问题描述】:

假设我有一个 json 数组数组

String jsonString = [["John","25"],["Peter","37"]];

我想将其解析为 ArrayList&lt;ArrayList&lt;String&gt;&gt; 对象。当我使用

Gson.fromJson(jsonString,ArrayList&lt;ArrayList&lt;String&gt;&gt;.class)

它似乎不起作用,我通过使用解决了问题

Gson.fromJson(jsonString,String[][].class)

有没有更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

是的,使用TypeToken

ArrayList<ArrayList<String>> list = gson.fromJson(jsonString, new TypeToken<ArrayList<ArrayList<String>>>() .getType());

TypeToken 允许您指定您实际需要的泛型类型,这有助于 Gson 在反序列化期间找到要使用的类型。

它使用这个 gem:Class#getGenericSuperClass()。它是一个匿名类的事实使它成为TypeToken&lt;...&gt; 的子类。相当于一个类

class Anonymous extends TypeToken<...>

该方法的规范表明

如果超类是参数化类型,则返回的Type 对象必须准确反映源代码中使用的实际类型参数。

如果你指定了

new TypeToken<String>().getType();

返回的Type 对象实际上是ParameterizedType,您可以在其上使用ParameterizedType#getActualTypeArguments() 检索实际类型参数。

类型参数将是上面示例中java.lang.StringType 对象。在您的示例中,它将是 ArrayList&lt;ArrayList&lt;String&gt;&gt; 的对应 Type 对象。 Gson 将继续沿着链条向下走,直到它构建出所需类型的完整映射。

【讨论】:

感谢您的快速响应.. :) 就像一个魅力.. 我可以知道这个 TypeToken 是如何获得有界类型的吗?我只是推断这会因为类型擦除而消失.. @BlackPanther 它使用这个 gem:Class#getGenericSuperClass()。它是一个匿名类的事实使它成为TypeToken&lt;...&gt; 的子类。它相当于class Anonymous extends TypeToken&lt;...&gt;。该方法的规范指出If the superclass is a parameterized type, the Type object returned must accurately reflect the actual type parameters used in the source code. @BlackPanther 这是一个老套路。 This 应该进一步解释。 哇..出色的设计..非常感谢您提供的信息...也许您应该将其作为答案的一部分,以便其他人可以了解实际的实现.. 我理解你所指的点......为了调用 getGenericSuperClass 方法,这个类必须是子类。天啊我傻了..!!再次感谢...:)

以上是关于是否可以使用 Gson.fromJson() 来获取 ArrayList<ArrayList<String>>?的主要内容,如果未能解决你的问题,请参考以下文章

Gson 使用总结 高级用法

Gson 使用总结 高级用法

Gson fromJson 在 Proguard 之后返回 null

Gson fromJson() 用法

如何解决gson.fromJson()在android中有错误

如何使用GSON检查JSON在Java中是否有效?