【问题标题】:is it possible to use Gson.fromJson() to get ArrayList<ArrayList<String>>?是否可以使用 Gson.fromJson() 来获取 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)

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

【问题讨论】:

    标签: java generics arraylist gson


    【解决方案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 方法,这个类必须是子类。天啊我傻了..!!再次感谢...:)
    猜你喜欢
    • 1970-01-01
    • 2016-08-23
    • 2013-10-05
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多