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

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] 


猜你喜欢

转载自blog.csdn.net/suyimin2010/article/details/80191811
今日推荐