Json转换利器Gson之实例六-注册TypeAdapter及处理Enum类型

枚举类型给我们的程序带来了好处,如何用Gson来实现与Json的互转呢?请看本文.

本文重点掌握如何自己写一个TypeAdapter及注册TypeAdapter和处理Enum类型.

实体类:

  1. public enum PackageState {  
  2.     PLAY, UPDATE, UPDATING, DOWNLOAD, DOWNLOADING,  
  3. }  
  1. public class PackageItem {  
  2.     private String name;  
  3.     private PackageState state;  
  4.     private String size;  
  5.   
  6.     public String getName() {  
  7.         return name;  
  8.     }  
  9.   
  10.     public void setName(String name) {  
  11.         this.name = name;  
  12.     }  
  13.   
  14.     public PackageState getState() {  
  15.         return state;  
  16.     }  
  17.   
  18.     public void setState(PackageState state) {  
  19.         this.state = state;  
  20.     }  
  21.   
  22.     public String getSize() {  
  23.         return size;  
  24.     }  
  25.   
  26.     public void setSize(String size) {  
  27.         this.size = size;  
  28.     }  
  29.   
  30.     @Override  
  31.     public String toString() {  
  32.         return "PackageItem [name=" + name + ", size=" + size + ", state="  
  33.                 + state + "]";  
  34.     }  
  35. }  


自己写一个转换器实现JsonSerializer<T>接口和jsonDeserializer<T>接口:

  1. mport java.lang.reflect.Type;  
  2.   
  3. import com.google.gson.JsonDeserializationContext;  
  4. import com.google.gson.JsonDeserializer;  
  5. import com.google.gson.JsonElement;  
  6. import com.google.gson.JsonParseException;  
  7. import com.google.gson.JsonPrimitive;  
  8. import com.google.gson.JsonSerializationContext;  
  9. import com.google.gson.JsonSerializer;  
  10.   
  11. public class EnumSerializer implements JsonSerializer<PackageState>,  
  12.         JsonDeserializer<PackageState> {  
  13.   
  14.     // 对象转为Json时调用,实现JsonSerializer<PackageState>接口  
  15.     @Override  
  16.     public JsonElement serialize(PackageState state, Type arg1,  
  17.             JsonSerializationContext arg2) {  
  18.         return new JsonPrimitive(state.ordinal());  
  19.     }  
  20.   
  21.     // json转为对象时调用,实现JsonDeserializer<PackageState>接口  
  22.     @Override  
  23.     public PackageState deserialize(JsonElement json, Type typeOfT,  
  24.             JsonDeserializationContext context) throws JsonParseException {  
  25.         if (json.getAsInt() < PackageState.values().length)  
  26.             return PackageState.values()[json.getAsInt()];  
  27.         return null;  
  28.     }  
  29.   
  30. }  

测试类:

  1. import com.google.gson.Gson;  
  2. import com.google.gson.GsonBuilder;  
  3.   
  4. public class GsonTest6 {  
  5.   
  6.     public static void main(String[] args) {  
  7.         GsonBuilder gsonBuilder = new GsonBuilder();  
  8.         gsonBuilder.registerTypeAdapter(PackageState.class,  
  9.                 new EnumSerializer());  
  10.         Gson gson = gsonBuilder.create();  
  11.         PackageItem item = new PackageItem();  
  12.         item.setName("item_name");  
  13.         item.setSize("500M");  
  14.         item.setState(PackageState.UPDATING);// 这个 state是枚举值  
  15.   
  16.         String s = gson.toJson(item);  
  17.         System.out.println(s);  
  18.   
  19.         System.out.println("--------------------------------");  
  20.   
  21.         PackageItem retItem = gson.fromJson(s, PackageItem.class);  
  22.         System.out.println(retItem);  
  23.     }  
  24. }  

 

输出结果(结果中已经将state的对应枚举类型转为了int类型):

  1. {"name":"item_name","state":2,"size":"500M"}  
  2. --------------------------------  
  3. PackageItem [name=item_name, size=500M, state=UPDATING]  

 

猜你喜欢

转载自zyjustin9.iteye.com/blog/2018729
今日推荐