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

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

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

实体类:

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

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

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

测试类:

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

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

[plain][/plain]

view plaincopy

  1. {“name”:”item_name”,”state”:2,”size”:”500M”}
  2. ——————————–
  3. PackageItem [name=item_name, size=500M, state=UPDATING]

实例代码下载: http://download.csdn.net/detail/lk_blog/4387822

 

相关文章推荐:

Json转换利器Gson之实例一-简单对象转化和带泛型的List转化

http://qiniu.devba.com/index.php/archives/1702.html
Json转换利器Gson之实例二-Gson注解和GsonBuilder

http://qiniu.devba.com/index.php/archives/1703.html

Json转换利器Gson之实例三-Map处理(上)

http://qiniu.devba.com/index.php/archives/1704.html
Json转换利器Gson之实例四-Map处理(下)

http://qiniu.devba.com/index.php/archives/1705.html
Json转换利器Gson之实例五-实际开发中的特殊需求处理

http://qiniu.devba.com/index.php/archives/1706.html
Json转换利器Gson之实例六-注册TypeAdapter及处理Enum类型

http://qiniu.devba.com/index.php/archives/1707.html

标签