Gson的使用与学习

GsonGoogle 出品的一个用于将 java 对象转化为 JSON 表示,并且也可以将 JSON 字符串转换为等价的 java 对象的 java 开源库。
GitHub地址: google-gson
Gson使用指南: Gson User Guide

Gson期初是Google内部使用的,开源后也被越来越多的个人与组织使用,具体可以看这here。现在JSON解析库还有解析效率更好的fastjson和jackson,当然这不是今天的的讨论重点。总之,Gson作为Google的亲儿子,还是非常值得去学习与探索的。

使用(所用示例均来自Gson使用指南)

一个基本的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Serializatio序列化
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]

// 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);

java对象示例:

1
2
3
4
5
6
7
8
class BagOfPrimitives {
private int value1 = 1;
private String value2 = "abc";
private transient int value3 = 3;
BagOfPrimitives() {
// no-args constructor无参构造器
}
}
1
2
3
4
5
6
7
8
9
10
// 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

注意:你不可以序列化循环引用的对象,因为这将导致无限的递归。

有关对象的细节

推荐使用私有域。
不需要使用任何注解指示字段包含序列化和反序列化。所有字段在当前类(和所有的超类)都包含在默认情况下。
如上例中的value3所示,如果一个字段被标记为transient,默认情况下,它将在JSON序列化和反序列化的时候被忽略。
嵌套类(包括内部类)

Gson注解
@SerializedName
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Box {

@SerializedName("w")
private int width;

@SerializedName("h")
private int height;

@SerializedName("d")
private int depth;

// Methods removed for brevity
}
public class Main {
public static void main(final String[] args) {
final GsonBuilder builder = new GsonBuilder();
final Gson gson = builder.create();

final Box box = new Box();
box.setWidth(10);
box.setHeight(20);
box.setDepth(30);

final String json = gson.toJson(box);
System.out.printf("Serialised: %s%n", json);

final Box otherBox = gson.fromJson(json, Box.class);
System.out.printf("Same box: %s%n", box.equals(otherBox));
}
}

上面的代码打印出的内容:

Serialised: {“w”:10,”h”:20,”d”:30}
Same box: true

@Expose注解
它有两个可选的元素:serialize 和 deserialize,通过这两个元素我们可以控制哪些是学序列化与反序列化的可行与否,它们的默认值都为 true 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Account {

@Expose(deserialize = false)
private String accountNumber;

@Expose
private String iban;

@Expose(serialize = false)
private String owner;

@Expose(serialize = false, deserialize = false)
private String address;

private String pin;
}

上例中,accountNumber是可序列化的,但是不可以反序列化,以此类推。

参考

gson-annotations-example