Gson-自定义序列化

作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
2015-桂林山水

上一篇文章《Gson教程-序列化与反序列化基础操作》介绍了Gson的特性和基本的使用方法。如果碰上一些特殊的使用场景:

  • 出生日期存储的是毫秒数,但输出JSON时需要是年月日的格式;
  • 有些字段不想输出;
  • 输出的字段名与对象中的字段名不相同。

怎么办呢?Gson提供了自定义序列化和反序列化,并且实现也非常简单,两步搞定:

  1. 实现JsonSerializer接口。
  2. 注册自定义的序列化实现。

一、需求

1、一个POJO类:Person,有两个属性:name和age。源代码如下。
2、序列化成JSON字符串时,name字段名输出为PersonName,age字段名输出为PersonAge。

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
31
32
33
34
35
36
37
38
39
40
41
42
/** **
* 简单的Java对象。
*
* @author <a href="mailto:aofengblog@163.com">聂勇</a>
*/
public class Person {
private String name;
private int age;
public Person() {
// nothing
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}

二、实现

1、自定义序列化

实现JsonSerializer接口的serialize方法,想怎么弄都可以随心所欲 :)

1
2
3
4
5
6
7
8
9
10
11
12
13
public class PersonSerializer implements JsonSerializer<Person> {
@Override
public JsonElement serialize(Person obj, Type type,
JsonSerializationContext context) {
JsonObject jo = new JsonObject();
jo.addProperty("PersonName", obj.getName());
jo.addProperty("PersonAge", obj.getAge());
return jo;
}
}

2、注册自定义的序列化

创建一个GsonBuilder,使用registerTypeAdapter方法注册自定义的序列化实现,然后生成Gson对象来进行序列化。

1
2
3
4
5
6
7
8
public static void main(String[] args) {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Person.class, new PersonSerializer());
Gson gson = builder.create();
Person obj = new Person("aofeng", 32);
System.out.println( gson.toJson(obj) );
}

运行上述代码,输出信息如下:

{“PersonName”:”aofeng”,”PersonAge”:32}

附:完整的源代码

三、参考资料