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

2022-09-01 11:29: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());

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

它使用以下 gem:Class#getGenericSuperClass()。。它是一个匿名类的事实使它成为 的子类。它相当于一个类,如TypeToken<...>

class Anonymous extends TypeToken<...>

该方法的规范指出

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

如果指定

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

返回的对象实际上是一个,您可以在其中使用 ParameterizedType#getActualTypeArguments() 检索实际的类型参数。TypeParameterizedType

在上面的示例中,类型参数将是 的对象。在您的示例中,它将是 的相应对象。Gson将继续沿着链条向下移动,直到它构建了所需的类型的完整地图。Typejava.lang.StringTypeArrayList<ArrayList<String>>


答案 2

推荐