Gson的TypeAapter可以理解成自定义序列化和返序列化。
自定义类型适配器需要实现两个接口:
JsonSerializer<T>
JsonDeserializer<T>
和两个方法:
//序列化
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<Timestamp>, JsonDeserializer<Timestamp> {
@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 value = "";
if(src != null){
value = 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<Entry>,JsonDeserializer<Entry>{
/**
* 序列化时调用
*/
@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]