Gson TypeAdapter用法
实例:写一个TypeAdapter,注册TypeAdapter来处理Enum类型.
实体类:
public enum Color {
RED("红色",1),GREEN("绿色",2),BLANK("白色",3), YELLO("黄色", 4);
private String name;
private int index;
private Color(String name, int index) {
this.name = name;
this.index = index;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
import java.util.Date;
public class Flower {
private String name;
private String PlaceofOrigin;
private Color color;
private Date date;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPlaceofOrigin() {
return PlaceofOrigin;
}
public void setPlaceofOrigin(String placeofOrigin) {
PlaceofOrigin = placeofOrigin;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "Flower [name=" + name + ", PlaceofOrigin=" + PlaceofOrigin + ", color=" + color + ", date=" + date
+ "]";
}
}
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;
public class EnumSerializer implements JsonSerializer<Color>,JsonDeserializer<Color> {
JsonPrimitive colorPrimitive;
public JsonElement serialize(Color color, Type typeOfSrc, JsonSerializationContext context) {
colorPrimitive = new JsonPrimitive(color.getName());
return colorPrimitive;
}
public Color deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
if(json.getAsJsonPrimitive().equals(colorPrimitive)){
String name = json.getAsJsonPrimitive().getAsString();
for(int i=0;i<Color.values().length;i++){
if(Color.values()[i].getName().equals(name)) return Color.values()[i];
}
}
return null;
}
}
测试类:
import java.util.Date;
import org.junit.Test;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class TestEnumGson {
//无注册自定义TyepAdapter
@Test
public void testEnum(){
System.out.println("-----------------无注册自定义TyepAdapter---------------------");
Flower flower = new Flower();
flower.setName("Rose");
flower.setPlaceofOrigin("China");
flower.setColor(Color.RED);
flower.setDate(new Date());
Gson gson = new Gson();
String flowerStr = gson.toJson(flower);
System.out.println(flowerStr);
Flower flower1 = gson.fromJson(flowerStr, Flower.class);
System.out.println(flower1);
}
//注册自定义TyepAdapter
@Test
public void testEnumSerializer(){
System.out.println("-----------------注册自定义TyepAdapter---------------------");
Flower flower = new Flower();
flower.setName("Rose");
flower.setPlaceofOrigin("China");
flower.setColor(Color.RED);
flower.setDate(new Date());
GsonBuilder gsonBuiler = new GsonBuilder();
gsonBuiler.registerTypeAdapter(Color.class, new EnumSerializer());
Gson gson = gsonBuiler
.setDateFormat("yyyy-MM-dd HH:mm:ss").create();
String flowerStr = gson.toJson(flower);
System.out.println(flowerStr);
Flower flower1 = gson.fromJson(flowerStr, Flower.class);
System.out.println(flower1);
}
}
结果:
-----------------注册自定义TyepAdapter---------------------
{"name":"Rose","PlaceofOrigin":"China","color":"红色","date":"2016-02-17 10:35:46"}
Flower [name=Rose, PlaceofOrigin=China, color=RED, date=Wed Feb 17 10:35:46 CST 2016]
-----------------无注册自定义TyepAdapter---------------------
{"name":"Rose","PlaceofOrigin":"China","color":"RED","date":"Feb 17, 2016 10:35:46 AM"}
Flower [name=Rose, PlaceofOrigin=China, color=RED, date=Wed Feb 17 10:35:46 CST 2016]
PS: 区别看color的值 "红色" 和 "RED", date不一样是因为设置了 gsonBuiler.setDateFormat("yyyy-MM-dd HH:mm:ss")
参考资料:
Gson官方文档:https://github.com/google/gson/blob/master/UserGuide.md
Gson指南(Gson官方文档中文版):http://www.letiantian.me/2014-05-22-java-gson-json/
Gson进阶(高级用法):
http://itroadmap.sinaapp.com/2015/11/04/gson%E8%BF%9B%E9%98%B6%EF%BC%88%E9%AB%98%E7%BA%A7%E7%94%A8%E6%B3%95%EF%BC%89/
Json转换利器Gson之实例六:http://blog.csdn.net/lk_blog/article/details/7685347