Gson的使用指南

介绍

Gson是一个可以把Java对象转化成JSON格式的字符串,也可以从一个JSON字符串转换为一个Java对象。Gson是一个开源项目,这里是地址

开始使用

可以使用

1
new Gson()

来创建主要的类Gson的实例。也可以使用GsonBuilder来定制你需要的Gson实例,比如版本控制等等。

基本的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(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 false = gson.fromJson("false", Boolean.class);
String str = gson.fromJson("\"abc\"", String.class);
String anotherStr = gson.fromJson("[\"abc\"]", String.class);

关于对象的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
  BagOfPrimitives() {
    // no-args constructor
  }
}
(Serialization)
BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj);
==> json is {"value1":1,"value2":"abc"}
Note that you can not serialize objects with circular references since that will result in infinite recursion.
(Deserialization)
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
==> obj2 is just like obj

以下是转换对象的时候几点事项: * 建议使用private的成员变量 * 没有必要对所有的成员变量使用任何的注解来表示这个变量需要被序列化或反序列化 * 如果一个成员变量被关键字transient修饰,(默认)那么它将在序列化和反序列化的时候被忽略 * 这样处理nulls是正确的 序列化的时候,一个null变量在输出的时候将被跳过 反序列化的时候,JSON中一个丢失的实体会被设置为null * 如果一个成员变量被synthetic修饰,在序列化和反序列化的时候会被忽略 * 内部类、匿名类、局部类会被忽略掉。

数组的例子

1
2
3
4
5
6
7
8
9
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);  ==> prints ["abc", "def", "ghi"]
(Deserialization)
int[] ints2 = gson.fromJson("[1,2,3,4,5]", int[].class);
==> ints2 will be same as ints

集合的例子

1
2
3
4
5
6
7
8
Gson gson = new Gson();
Collection<Integer> ints = Lists.immutableList(1,2,3,4,5);
(Serialization)
String json = gson.toJson(ints); ==> json is [1,2,3,4,5]
(Deserialization)
Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();
Collection<Integer> ints2 = gson.fromJson(json, collectionType);
ints2 is same as ints

序列化和反序列化通用的类型

当你在调用toJson(obj)的时候,Gson会调用obj.getClass()来获得即将被序列化的对象的成员变量。然后调用fromJson(json, MyClass.class)方法来得到MyClass的对象。如果这个类没有使用范性的情况下是正常的。但是,如果是使用范型的,由于java的类型擦除机制,就不能正常工作了。如:

1
2
3
4
5
6
7
class Foo<T> {
  T value;
}
Gson gson = new Gson();
Foo<Bar> foo = new Foo<Bar>();
gson.toJson(foo); // May not serialize foo.value correctly
gson.fromJson(json, foo.getClass()); // Fails to deserialize foo.value as Bar