前言:因为个人需求,用到了JSON传输数据,但是我一直在用org.json的库,用法比较繁琐复杂,难以操作。偶然的一次吐槽中,@Nothing 解决了我的这个一个问题,那就是可以使用GSON来反序列化JSON为一个Java对象,操作简单且逻辑上更加简单。
什么是GSON
? GITHUB项目地址:https://github.com/google/gson
Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。 Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。 在使用这种对象转换之前,需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。 类里面只要有get和set方法,Gson完全可以实现复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
——来自知乎https://zhuanlan.zhihu.com/p/62841535
GitHub上官方的一段Readme文档:
Gson is a Java library that can be used to convert Java Objects into their JSON representation. It can also be used to convert a JSON string to an equivalent Java object. Gson can work with arbitrary Java objects including pre-existing objects that you do not have source-code of.
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是一个Java库,可用于将Java对象转换为其JSON表示形式,还可用于将JSON字符串转换为等效的Java对象.Gson可与任意Java对象一起使用,包括您不存在的预先存在的对象。 有源代码。
有一些开源项目可以将Java对象转换为JSON,但是大多数项目都需要将Java批注放置在类中;如果无法访问源代码,则无法执行某些操作。 Gson认为这两者都是非常重要的设计目标。
什么?要我说人话?(逃)简单点就是:
可以很方便的将JSON数据反序列化到JavaBean对象中(这个JavaBean可以不是严格的JavaBean格式)
GSON自带函数参数讲解
Gson自带了fromJson()和toJson()这两个最常用的函数,那么他们的参数分别是什么呢? fromJson(String json,Class<?> clazz);
json顾名思义,就是需要操作的JSON字符串,那么clazz是什么呢?
clazz参数就是你所要序列化/反序列化的Java对象所属的JavaBean类,他是一个Class类型的类,每一个对象都是由Class类作为模板进行声明的,就好比巧克力工厂中的巧克力模板一样,虽然有各式各样口味的巧克力,但是模板只有一种的话,那么他所作出来的巧克力,只有味道上的差别,本质上还是一样的。我们的Gson也是这么想的,将JavaBean对象的Class传入之后,GSON会进行反射操作,获取JavaBean对象的所有属性,然后再通过自身算法,将JSON中的各种数据写入到这么一个JavaBean对象中,最后返回值就是你所传入进来的class类模板生成的一个对象。这也就是为什么GSON中的JavaBean中的成员变量名必须与JSON中的数据名保持一致,如:{"age":4}
那么在JavaBean中接收这个数据的成员变量也必须名为age
,否则GSON无法识别进行序列化/反序列化。
最简单的JSON反序列化/序列化
如何使用呢?我们首先来举一个反序列化的例子:
假设一个JSON他是这样的:{"user":{"id":1,name":"VioletTec","age":3,"sex":"male"}}
从字面意思来理解,可以看到这是一个用户数据JSON,ID
为1
,昵称
为VioetTec
,年龄
为3
岁,性别
为男
如何将这一串的JSON解析呢?GSON中提供了fromJson()
和toJson()
两个方法,fromJson()
顾名思义就是将JSON反序列化,
那么我们可以新建一个JavaBean来作为这个JSON反序列化的模板(JavaBean无需严格按照格式进行创建)为了方便甚至可以直接将属性定义为public
public class User{ public int id; public String name; public int age; public String sex; }
然后直接新建一个GSON对象,调用其fromJson()
方法。
String json = "{\"user\":{\"id\":1,name\":\"VioletTec\",\"age\":3,\"sex\":\"male\"}}" Gson gson = new Gson(); User u = gson.fromJson(json,User.class); System.out.println("id:"+u.id+",name:"+u.name+"age:"+u.age);
这样就可以获取到反序列化到的对象了!
那么如何序列化呢?还是根据上面的例子,我们接着来序列化一下User对象
User u = new User(); u.id=2; u.name="Ke_Ke"; u.age=6; u.sex="male";
现在我们得到了一个id
为2
,name
为Ke_Ke
,年龄
为6
岁,性别
为男
的User
对象
还是继续调用GSON自带的方法,这个方法是toJson()
方法
Gson gson = new Gson(); String json = g.toJson(u); System.out.println(json);
输出的结果是:{"id":2,name":"Ke_Ke","age":6,"sex":"male"}
这就是最简单的序列化/反序列化JSON,接下来请翻页查看结构更加丰富的JSON序列化/反序列化