2)不需要使用任何的注解来表明哪些字段需要序列化,哪些字段不需要序列化。默认情况下,包括所有的字段,以及从父类继承过来的字段。
3)如果一个字段被 transient
关键字修饰的话,它将不参与序列化。
4)如果一个字段的值为 null,它不会在序列化后的结果中显示。
5)JSON 中缺少的字段将在反序列化后设置为默认值,引用数据类型的默认值为 null,数字类型的默认值为 0,布尔值默认为 false。
接下来,来看一个序列化集合的例子。
List list =new ArrayList<>();
list.add(“好好学习”);
list.add(“天天向上”);
String json = gson.toJson(list);
结果如下所示:
[“好好学习”,“天天向上”]
反序列化的时候,也很简单。
List listResult = gson.fromJson(json,List.class);
结果如下所示:
[好好学习, 天天向上]
我女朋友是一个很细心也很贴心的人,在你调用 toJson()
方法进行序列化的时候,她会先判 null,防止抛出 NPE,再通过 getClass()
获取参数的类型,然后进行序列化。
public String toJson(Object src) {
if (src == null) {
return toJson(JsonNull.INSTANCE);
}
return toJson(src, src.getClass());
}
但是呢?对于泛型来说,getClass()
的时候会丢掉参数化类型。来看下面这个例子。
public class Foo {
T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
public static void main(String[] args) {
Gson gson = new Gson();
Foo foo = new Foo();
Bar bar = new Bar();
foo.set(bar);
String json = gson.toJson(foo);
}
}
class Bar{
private int age = 10;
private String name = “图灵”;
}
假如你 debug 的时候,进入到 toJson()
方法的内部,就可以观察到。
foo 的实际类型为 Foo<Bar>
,但我女朋友在调用 foo.getClass()
的时候,只会得到 Foo,这就意味着她并不知道 foo 的实际类型。
序列化的时候还好,反序列化的时候就无能为力了。
Foo foo1 = gson.fromJson(json, foo.getClass());
Bar bar1 = foo1.get();
这段代码在运行的时候就报错了。
Exception in thread “main” java.lang.ClassCastException: class com.google.gson.internal.L