使用Gson解析出ArrayList等容器类

============================
原创,转载请指明出处(http://blog.xinspace.xin)。

参考:is it possible to use Gson.fromJson() to get ArrayList<ArrayList>?

Gson在解析JSON格式字符串的时候,可以自定义Token把JSON格式字符串解析成某个类。比如下面的这段JSON字符串:

1
2
3
4
5
6
7
8
9
10
11
12
{
status: 200
error_msg: null
data: [
{
param1: "xxx"
param2: "xxx"
},
//下面有多个json对象,这里省略了
......
]
}

这段JSON格式的字符串可以定义如下的类来对应:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 外层包裹
*/
public class RetModule {
public int status;

public String error_msg;

public ArrayList<DataModule> data;
}

/**
* 内部的列表数据
*/
public class DataModule {
public String param1;

public String param2;
}

其中RetModule类是包裹在外层的类,保存JSON字符串的status等字段,而DataModule类是真正的数据,保存数组中的每个元素。

那么要把JSON数组data映射为ArrayList,就可以通过自定义Token来完成,代码如下:

1
ArrayList<DataModule> data = gson.fromJson(jsonString, new TypeToken<ArrayList<DataModule>>() {}.getType());

这段代码中,取出了ArrayList<DataModule>类的类型,然后Gson就把相应的JSON数组转换成这个自定义的类型。

同样的,可以用TypeToken来自定义更复杂的类型,让Gson能够解析更复杂的JSON字符串,如要解析下面的字符串:

1
[["John","25"],["Peter","37"]];

需要两层列表,外面一层包含两个列表元素,而这两个列表元素又分别包含两个元素。可以把上面的字符串映射为ArrayList<ArrayList>类型。自定义Token的代码如下:

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