GSON基础用法-如何序列化/反序列化JSON

前言:因为个人需求,用到了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,ID1昵称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";

现在我们得到了一个id2nameKe_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序列化/反序列化

页面: 1 2
标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Captcha Code