Gson 自定义类型适配器 (TypeAdapter)

Gson的TypeAapter可以理解成自定义序列化和返序列化。
自定义类型适配器需要实现两个接口:
JsonSerializer
JsonDeserializer
和两个方法:

//序列化 public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context); //反序列化 public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)throws JsonParseException;

其中 JsonElement 的类层次为:


实例一:Timestamp 类型适配器
注册类型适配器:
Gson gson = new GsonBuilder() .registerTypeAdapter(Timestamp.class, new TimestampAdapter()) .create();

自己写的一个 Timestamp 类型适配器
public class TimestampAdapter implements JsonSerializer, JsonDeserializer {@Override public Timestamp deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if(json == null){ return null; } else { try { return new Timestamp(json.getAsLong()); } catch (Exception e) { return null; } } }@Override public JsonElement serialize(Timestamp src, Type typeOfSrc, JsonSerializationContext context) { String valuehttps://www.it610.com/article/= ""; if(src != null){ value = https://www.it610.com/article/String.valueOf(src.getTime()); } return new JsonPrimitive(value); }}

实例二:fistName,lastName就要以userName:firtName-lastName的格式展现。
Entry实体,用于保存firtName、lastName。
public class Entry { private String firstName; private String lastName; public Entry(String firstName, String lastName) { super(); this.firstName = firstName; this.lastName = lastName; } get()和set()方法省略......! @Override public String toString() { return "Entry [firstName=" + firstName + ", lastName=" + lastName + "]"; } }

自定义EntrySerializer类实现 JsonSerializer、JsonDeserializer接口,用来自定义转换。
public class EntrySerializer implements JsonSerializer,JsonDeserializer{ /** * 序列化时调用 */ @Override public JsonElement serialize(Entry entry, Type typeOfSrc, JsonSerializationContext context) { if(entry == null){ return null; } /* * 看下JsonElement类的实现类, * 他可以将entry转换为不同的类型例如数组,对象; * 我这里的需求是将firtName和lastName转换为firtName-lastName的格式,用下面这个实现类 */ JsonElement json = new JsonPrimitive(entry.getFirstName()+"-"+entry.getLastName()); return json; }/** * 反序列化时调用 */ @Override public Entry deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { String[] names=json.toString().split("-"); String firstName=names[0]; String lastName=names[1]; Entry entry = new Entry(firstName, lastName); return entry; }}

测试代码如下:

public class EntrySerializerTest { public static void main(String[] args) { GsonBuilder gsonBuilder = new GsonBuilder(); //注册适配器 gsonBuilder.registerTypeAdapter(Entry.class,new EntrySerializer()) .setPrettyPrinting(); //对结果格式化一下 Gson gson = gsonBuilder.create(); //我们去注册时,通常名字由两部分组成,fistName,lastName Entry entry = new Entry("xia","liang"); User user = new User(); user.setUserName(entry); user.setUserPwd("xl123"); user.setAge(24); //序列化 String json = gson.toJson(user); System.out.println("序列化结果:\n"+json); //反序列化 user=gson.fromJson(json,User.class); System.out.println("反序列化结果:\n"+user); } }

返回结果如下:
序列化结果: { "userName": "xia-liang", "userPwd": "xl123", "age": 24 } 反序列化结果: User [userName=Entry [firstName="xia, lastName=liang"], userPwd=xl123, age=24]



【Gson 自定义类型适配器 (TypeAdapter)】

    推荐阅读