作者:聂勇      欢迎转载,请保留作者信息并说明文章来源!

上一篇文章《Gson教程-序列化与反序列化基础操作》介绍了Gson的特性和基本的使用方法。如果碰上一些特殊的使用场景:
- 出生日期存储的是毫秒数,但输出JSON时需要是年月日的格式;
- 有些字段不想输出;
- 输出的字段名与对象中的字段名不相同。
怎么办呢?Gson提供了自定义序列化和反序列化,并且实现也非常简单,两步搞定:
- 实现JsonSerializer接口。
- 注册自定义的序列化实现。
一、需求
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() {              }          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}
附:完整的源代码
三、参考资料