假设我有一个json数组数组
String jsonString = [["John","25"],["Peter","37"]];
我想把它压缩成ArrayList< ArrayList< String>>对象.当我用的时候
Gson.fromJson(jsonString,ArrayList的< ArrayList的<字符串>>的.class)
它似乎没有用,我通过使用做了一个工作
Gson.fromJson(jsonString,字符串[] [].类)
有一个更好的方法吗?
解决方法:
是的,使用TypeToken
.
ArrayList<ArrayList<String>> list = gson.fromJson(jsonString, new TypeToken<ArrayList<ArrayList<String>>>() {}.getType());
TypeToken允许您指定实际需要的泛型类型,这有助于Gson找到在反序列化期间使用的类型.
它使用这个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.
如果你指定了
new TypeToken<String>(){}.getType();
返回的Type对象实际上是ParameterizedType,您可以使用ParameterizedType#getActualTypeArguments()
检索实际的类型参数.
在上面的示例中,type参数将是java.lang.String的Type对象.在您的示例中,它将是ArrayList< ArrayList< String>>的相应Type对象. Gson将一直走下去,直到它构建了所需类型的完整地图.