假设我有一个json
数组数组
String jsonString = [["John","25"],["Peter","37"]];
我想把它变成ArrayList<ArrayList<String>>
个对象。当我用的时候
Gson.fromJson(jsonString,ArrayList<ArrayList<String>>.class)
它似乎不起作用,我通过使用
做了一个工作 Gson.fromJson(jsonString,String[][].class)
有更好的方法吗?
答案 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将一直走下去,直到它构建了所需类型的完整地图。