是否可以使用Gson.fromJson()来获取ArrayList <arraylist <string>&gt;?</arraylist <string>

时间:2014-03-08 16:15:44

标签: java generics arraylist gson

假设我有一个json数组数组

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

我想把它变成ArrayList<ArrayList<String>>个对象。当我用的时候

Gson.fromJson(jsonString,ArrayList<ArrayList<String>>.class)

它似乎不起作用,我通过使用

做了一个工作

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

有更好的方法吗?

1 个答案:

答案 0 :(得分:67)

是的,请使用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()检索实际类型参数。

在上面的示例中,type参数将是Type的{​​{1}}对象。在您的示例中,它将是java.lang.String的相应Type对象。 Gson将一直走下去,直到它构建了所需类型的完整地图。