泛型:
Gson使用指南
概览
Gson的目标
Gson性能和可扩展性
Gson用户
使用Gson(这里指的是android)
在Gradle/Android中使用Gson
例子
对象实例
对象细节
嵌套类(包括内部类)
数组示例
集合示例
序列化和反序列化泛型类型
任意类型对象集合的序列化和反序列化
内置的序列化器和反序列化器
自定义序列化和反序列化
编写序列化程序
编写反序列化程序
编写实例创建器
紧凑型 vs JSON的漂亮输出格式
空对象支持
版本控制支持
从序列化和反序列化中排除字段
JSON字段命名支持
在自定义序列化和反序列化之间共享状态
流
设计Gson的问题
Gson的未来改进
概览
Gson是一个Java库,可用于将Java对象转换为其JSON表示。还可以用于将JSON字符串转换为等效的Java对象。
Gson可以处理任意Java对象,包括没有在代码中预设的对象。
Gson的目标
提供易于使用的机制,如toString()构造函数(工厂方法),将Java转换为JSON,反之亦然
允许将预先存在的不可修改对象转换为JSON或从JSON转换
允许对象的自定义表示
支持任意复杂的对象
生成紧凑且可读的JSON输出
Gson性能和可扩展性
Gson用户
Gson的使用
要使用的主要类是Gson,可以通过调用创建的new Gson()以及GsonBuilder类用于创建具有各种设置(如版本控制等)的Gson实例。
在调用Json操作时,Gson实例不维护任何状态。因此,您可以重用相同的Gson对象自由地为多个Json进行序列化和反序列化操作。
在Gradle/Android中使用Gson
dependencies {
implementation 'com.google.code.gson:gson:2.8.5'
}
具体版本请参照网站
https://github.com/google/gson
例子:
// 序列化
Gson gson = new Gson();
gson.toJson(1); // ==> 1
gson.toJson("abcd"); // ==> "abcd"
gson.toJson(new Long(10)); // ==> 10
int[] values = { 1 };
gson.toJson(values); // ==> [1]
// 反序列化
int one = gson.fromJson("1", int.class);
Integer one = gson.fromJson("1", Integer.class);
Long one = gson.fromJson("1", Long.class);
Boolean false = gson.fromJson("false", Boolean.class);
String str = gson.fromJson("\"abc\"", String.class);
String[] anotherStr = gson.fromJson("[\"abc\"]", String[].class);
对象实例
class BagOfPrimitives{
private int value1 = 1;
private String value2 = "abc";
private transient int value3 = 3;
BagOfPrimitives{
// 无参构造
}
}
// 序列化
BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj);
// ==> json 内容是 {"value1":1,"value2":"abc"}
// 反序列化
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
// ==> obj2 是一个像 obj 的对象
对象细节:
最好使用private修饰字段
无需使用任何注释来指示要进行序列化和反序列化的字段。默认情况下当前类(包括所有从父类继承)的所有字段都会被包含
如果一个字段被transient修饰了,则在序列化和反序列化的过程会被忽略
Gson实现会正确处理空值
当序列化时,一个为空的字段将被忽略
当反序列化时,在反序列化时,JSON中缺少的条目导致将对象中的相应字段设置为其默认值:对象类型为null,数字类型为零,布尔值为false。
如果字段是合成的,则会被忽略,并且不包含在JSON序列化或反序列化中。
内部类,匿名类和本地类的字段会被忽略并且不被包含在序列化和反序列化中
嵌套类(包括内部类)
Gson能够地序列化和反序列化静态嵌套类。但是单纯的内部类不能被Gson序列化和反序列化,因为再反序列的时候需要一个实例的引用去获得实际的类型,你可以通过使用静态内部类或为其提供自定义InstanceCreator来解决此问题,如:
public class A {
public String a;
class B {
public String b;
public B() {
// B的无参构造
}
}
}
注意:上述的类B不能被Gson序列化。
可以通过定义B为静态内部类,来让Gson实现序列化和反序列化,如:
public class A {
public String a;
static class B {
public String b;
public B() {
// B的无参构造
}
}
}
也可以通过一个自定义的creator来解决,如:
public class InstanceCreatorForB implements InstanceCreator {
private final A a;