作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
上一篇文章《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}
附:完整的源代码
三、参考资料