Gson是一个Java库,用来实现Json和Java对象之间的相互转换。Gson是一个托管在https://github.com/google/gson的开源项目。
Gson中主要的类是Gson,也可以使用类GsonBuilder在创建Gson对象的同时设置一些选项。
Gson对象在处理Json时不会保存任何状态,所以使用者能够很轻松的对同一个Gson对象进行多次序列化、反序列化等操作。
示例:基本使用
//Serialization
Gson gson = new Gson();
gson.toJson(1); //==> prints 1
gson.toJson("abcd"); //==> prints "abcd"
gson.toJson(new Long(10)); //==> prints 10
int[] values = { 1 };
gson.toJson(values); //==> prints [1]
//Deserialization
int one = gson.fromJson("1", int.class);
Integer one = gson.fromJson("1", Integer.class);
Long one = gson.fromJson("1", Long.class);
Boolean f = gson.fromJson("false", Boolean.class);
String str = gson.fromJson("\"abc\"", String.class);
String anotherStr = gson.fromJson("[\"abc\"]", String.class);
//Serialization
BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj);
//==> json is {"value1":1,"value2":"abc"}
示例:对象与Json之间转换
定义BagOfPrimitives类:
class BagOfPrimitives {
private int value1 = 1;
private String value2 = "abc";
private transient int value3 = 3;
BagOfPrimitives() {
// no-args constructor
}
}
序列化为Json:
//Serialization
BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj);
//==> json is {"value1":1,"value2":"abc"}
不要序列化含有循环引用的对象,否则会造成无限的递归。
反序列化:
//Deserialization
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
//==> obj2 is just like obj
处理对象时的一些细节:
推荐使用私有字段(译者:可以通过反射获取私有字段的名称和值)
没有必要使用标注指明哪些字段该被序列化或者反序列化。在当前类(也包括其父类)中的所有字段都默认会被序列化/反序列化。
如果某字段在声明时使用了关键字transient,默认情况下不会被序列化/反序列化。
Gson如下处理null字段:
序列化时候null字段会被跳过
反序列化时,类中有但Json中没有的字段将设值为null。
synthetic字段不会被序列化/反序列化。
在外部类(outer classes)中的内部类(inner classes)、匿名类(anonymous classes)和局部类(local classes)中的字段不会被序列化/反序列化。
嵌套类(包括内部类)的处理
Gson可以很轻松地序列化嵌套类,且能够反序列化静态的嵌套类。Gson无法自动地反序列化纯粹的内部类,是因为内部类的无参构造函数需要引用包含它的对象(即外部类的实例)。要反序列化静态类,可以将内部类静态化或者提供一个自定义的实例创造器(instance creator)。下面是一个示例:
public class A {
public String a;
class B {
public String b;
public B() {
// No args constructor for B
}
}
}
上面的类B无法被Gson序列化。由于类B是一个(非静态的)内部类,Gson也无法反序列化{"b":"abc"}到类B的实例中。如果B被声明为static class B,那么Gson就能对这个字符串反序列化了。
另外一个解决方法是为B写一个实例创建器:
public class InstanceCreatorForB implements InstanceCreator {
private final A a;
public InstanceCreatorForB(A a) {
this.a = a;
}
public A.B createInstance(Type type) {
return a.new B();
}
}
这种方法是可行的,但是不推荐。(译者表示没看懂这个实例创建器,不知道该怎么用)
示例:数组
Gson gson = new Gson();
int[] ints = {1, 2, 3, 4, 5};
String[] strings = {"abc", "def", "ghi"};
//Serialization
gson.toJson(ints); ==> prints [1,2,3,4,5]
gson.toJson(strings