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


让我说我有一个 json 数组数组

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

我想把它放进去 ArrayList<ArrayList<String>> 对象。当我用的时候

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

它似乎不起作用,我做了一个使用的工作

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

有一个更好的方法吗?


30
2018-03-08 16:15


起源




答案:


是的,用一个 TypeToken

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

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

它使用这个宝石: Class#getGenericSuperClass()。它是一个匿名类的事实使它成为一个子类 TypeToken<...>。它等同于类

class Anonymous extends TypeToken<...>

该方法的规范说明了这一点

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

如果你指定了

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

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

类型参数将是 Type 对象 java.lang.String 在上面的例子中。在你的例子中,它将是一个对应的 Type 对象 ArrayList<ArrayList<String>>。 Gson将一直走下去,直到它构建了所需类型的完整地图。


67
2018-03-08 16:17



感谢快速回复.. :)就像一个魅力..我可以知道这个TypeToken如何得到有界类型?我只是推断,由于类型擦除,这将消失。 - Thirumalai Parthasarathi
@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. - Sotirios Delimanolis
@BlackPanther这是一个老黑客。 这个 应该进一步解释。 - Sotirios Delimanolis
哇..优秀的设计..非常感谢你的信息...也许你应该把它作为答案的一部分,以便其他人可以学习实际的实施.. - Thirumalai Parthasarathi
@BlackPanther :(我为你做了一个准备好的例子。 - Sotirios Delimanolis