鱼喃

听!布鲁布鲁,大鱼又在那叨叨了

Gson--更快的json数据解析库

上次写了一篇json与list互相转换的例子,用的是json-lib,大家也看到了,要用到六个包!最近换用了gson来解析json数据。用起来挺方便的,而且只需要用一个包。
关于json解析的第三方类库有很多,常用的有gson(google的)、fastjson(阿里巴巴的)、jackson(开源)、json-lib(很早了)。

关于gson

前面也说到了,是谷歌公司处于自己的需要开发的,第一版出现于08年5月。gson里面的调用很简单,基本只有tojson和fromjson这两种重载方法,但是gson的功能较之其他的要多。

正如官网所说的一样,gson有着其他第三方库所不具有的功能:

“There are a few open-source projects that can convert Java objects to JSON. However, most of them require that you place Java annotations in your classes; something that you can not do if you do not have access to the source-code. Most also do not fully support the use of Java Generics. Gson considers both of these as very important design goals.”

需要的准备

要用gson,就要导入gson的jar包(gson-XXX.jar),可以在github上下载最新版本(官方地址,pom源代码形式)。

示例代码

实体类Obj

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Obj{
int value;
public Obj(int value){
this.value=value;
}

public int getValue() {
return value;
}

public void setValue(int value) {
this.value = value;
}
}

仅仅是为了演示,所以只设置了一个int值,其他自定义类型也可以的。

Obj对象转json数据

1
2
3
4
public static String obj2json(Obj obj){
String json = new Gson().toJson(obj);
return json;
}

基本没啥可说的,调用一下就行。

json数据转回Obj对象

1
2
3
4
public static Obj json2obj(String json){
Obj obj = new Gson().fromJson(json, Obj.class);
return obj;
}

注意第二个参数,这是要设置转换成的类型,可以是它的超类,但是这样会有数据损失(子类的)。

list列表对象转换成json数据

1
2
3
4
public static String list2json(List list){
String json = new Gson().toJson(list);
return json;
}

跟上面Obj对象的调用方法一样。

json数据转换成list列表

1
2
3
4
public static List json2list(String json){
List list= new Gson().fromJson(json, new TypeToken<List>(){}.getType());
return list;
}

关于第二个参数,是要传递类型,但是没有办法传递诸如List.class这种形式,只能另外想办法,于是有TypeToken类,看包名是反射机制。
关于代码中的“new TypeToken(){}.getType()”,我也不是很懂,网上找到这么一段话:
“GSON提供了 TypeToken 这个类来帮助我们捕获(capture)像ArrayList这样的泛型信息。test3()的第一行代码创建了一个 匿名内部类 ,这样,Java编译器就会把泛型信息编译到这个匿名内部类里,然后在运行时就可以被 getType() 方法用 反射API 提取到。”

至于其他如map等等的类型就不写了,用法类似。

测试方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static void main(String[] args) {
List list=new ArrayList();
for(int i=0; i<3; i++){
list.add(new Obj(i));
}

String json = list2json(list);
System.out.println(json);

List list2 = json2list(json);
for(Obj o:list2){
System.out.println(o.getValue());
}

Obj obj = new Obj(4);
json = obj2json(obj);
System.out.println(json);

Obj obj2 = json2obj(json);
System.out.println(obj2.getValue());
}

Demo);

四种解析库的比较可以参考:各个JSON技术的比较