转载请出自出处:http://eksliang.iteye.com/blog/2175595
一.概述
Gson的TypeAapter可以理解成自定义序列化和返序列化
二、应用场景举例
例如我们通常去注册时(那些外国网站),会让我们输入firstName,lastName,但是转到我们都是国人吗,心想输入进去的fistName,lastName就要以userName:firtName-lastName的格式展现。
参考实例:
Entry实体,用于保存firtName、lastName
package com.ickes.json.daomain;
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接口,用来自定义转换
JsonSerializer:序列化接口;
JsonDeserializer:反序列化接口;
EntrySerializer类代码如下:
package com.ickes.json;
import java.lang.reflect.Type;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.ickes.json.daomain.Entry;
/**
* 自定义序列化和反序列化
* @author Ickes
*
*/
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;
}
}
测试代码如下:
package com.ickes.json;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.ickes.json.daomain.Entry;
import com.ickes.json.daomain.User;
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]