上次写了一篇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 | class Obj{ |
仅仅是为了演示,所以只设置了一个int值,其他自定义类型也可以的。
Obj对象转json数据
1 | public static String obj2json(Obj obj){ |
基本没啥可说的,调用一下就行。
json数据转回Obj对象
1 | public static Obj json2obj(String json){ |
注意第二个参数,这是要设置转换成的类型,可以是它的超类,但是这样会有数据损失(子类的)。
list列表对象转换成json数据
1 | public static String list2json(List list){ |
跟上面Obj对象的调用方法一样。
json数据转换成list列表
1 | public static List json2list(String json){ |
关于第二个参数,是要传递类型,但是没有办法传递诸如List.class这种形式,只能另外想办法,于是有TypeToken类,看包名是反射机制。
关于代码中的“new TypeToken(){}.getType()”,我也不是很懂,网上找到这么一段话:
“GSON提供了 TypeToken 这个类来帮助我们捕获(capture)像ArrayList这样的泛型信息。test3()的第一行代码创建了一个 匿名内部类 ,这样,Java编译器就会把泛型信息编译到这个匿名内部类里,然后在运行时就可以被 getType() 方法用 反射API 提取到。”
至于其他如map等等的类型就不写了,用法类似。
测试方法
1 | public static void main(String[] args) { |
(Demo);
四种解析库的比较可以参考:各个JSON技术的比较