是否可以使用 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<ArrayList<String>>
对象。当我使用
Gson.fromJson(jsonString,ArrayList<ArrayList<String>>.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<...>
的子类。相当于一个类
class Anonymous extends TypeToken<...>
该方法的规范表明
如果超类是参数化类型,则返回的
Type
对象必须准确反映源代码中使用的实际类型参数。
如果你指定了
new TypeToken<String>().getType();
返回的Type
对象实际上是ParameterizedType
,您可以在其上使用ParameterizedType#getActualTypeArguments()
检索实际类型参数。
类型参数将是上面示例中java.lang.String
的Type
对象。在您的示例中,它将是 ArrayList<ArrayList<String>>
的对应 Type
对象。 Gson 将继续沿着链条向下走,直到它构建出所需类型的完整映射。
【讨论】:
感谢您的快速响应.. :) 就像一个魅力.. 我可以知道这个 TypeToken 是如何获得有界类型的吗?我只是推断这会因为类型擦除而消失.. @BlackPanther 它使用这个 gem:Class#getGenericSuperClass()
。它是一个匿名类的事实使它成为TypeToken<...>
的子类。它相当于class Anonymous extends TypeToken<...>
。该方法的规范指出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 fromJson 在 Proguard 之后返回 null