1. 程式人生 > >Gson的日常用法

Gson的日常用法

其他相關的資料百度,各大部落格論壇都有 我就不一一抄襲總結了..


  • 簡單物件轉換

Obj obj =  new Gson().fromJson(json,Obj .class);

  • List簡單物件轉換

List<Obj>  objList = new Gson().fromJson(json,new TypeToken<List<Obj>>(){}.getType());

  • GsonBuilder物件使用

  1.  //注意這裡的Gson的構建方式為GsonBuilder,區別於test1中的Gson gson = new Gson();
      
  2.         Gson gson = new GsonBuilder()  
  3.         .excludeFieldsWithoutExposeAnnotation() //不匯出實體中沒有用@Expose註解的屬性  
  4.         .enableComplexMapKeySerialization() //支援Map的key為複雜物件的形式
      
  5.         .serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")//時間轉化為特定格式    
  6.         .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//會把欄位首字母大寫,注:對於實體上使用了@SerializedName註解的不會生效.
      
  7.         .setPrettyPrinting() //對json結果格式化.  
  8.         .setVersion(1.0)    //有的欄位不是一開始就有的,會隨著版本的升級新增進來,那麼在進行序列化和返序列化的時候就會根據版本號來選擇是否要序列化.  
  9.                             //@Since(版本號)能完美地實現這個功能.還的欄位可能,隨著版本的升級而刪除,那麼  
  10.                             //@Until(版本號)也能實現這個功能,GsonBuilder.setVersion(double)方法需要呼叫.  
  11.         .create();  

  • Gson註解(應該還有很多)

  1.     private int id;   //不匯出
  2.       
  3.     @Expose    //輸出json欄位 不指定Name
  4.     private String name;  
  5.       
  6.     @Expose  
  7.     @SerializedName("bir")  //重新指定 匯出欄位為bir
  8.     private Date birthDay;  
  9.   

  • Map的處理(簡單物件)

  1.  Map<Point, String> map1 = new LinkedHashMap<Point, String>();// 使用LinkedHashMap將結果按先進先出順序排列  
  2.         map1.put(new Point(56), "a");  
  3.         map1.put(new Point(88), "b");  
  4.         String s = gson.toJson(map1);  
  5.         System.out.println(s);// 結果:[[{"x":5,"y":6},"a"],[{"x":8,"y":8},"b"]]  
  6.   
  7.         Map<Point, String> retMap = gson.fromJson(s,  
  8.                 new TypeToken<Map<Point, String>>() {  
  9.                 }.getType());  
  10.         for (Point p : retMap.keySet()) {  
  11.             System.out.println("key:" + p + " values:" + retMap.get(p));  
  12.         }  
  13.         System.out.println(retMap);  

  • Map的複雜物件處理

  1.  Map<String, Object> map = new LinkedHashMap<String, Object>();  
  2.         map.put("students", stulist);  
  3.         map.put("teachers", teacherList);  
  4.   
  5.         Gson gson = new Gson();  
  6.         String s = gson.toJson(map);  
  7.         System.out.println(s);  
  8.   
  9.         System.out.println("----------------------------------");  
  10.   
  11.         Map<String, Object> retMap = gson.fromJson(s,  
  12.                 new TypeToken<Map<String, List<Object>>>() {  
  13.                 }.getType());  
  • 實際開發中的特殊需求處理

[{"tableName":"students","tableData":[{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":2,"name":"曹貴生","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":3,"name":"柳波","birthDay":"Jun 22, 2012 9:54:49 PM"}]},{"tableName":"teachers","tableData":[{"id":1,"name":"米老師","title":"教授"},{"id":2,"name":"丁老師","title":"講師"}]}]

  1. public class Student {  
  2.     private int id;  
  3.     private String name;  
  4.     private Date birthDay;  
  5. }
  1. public class Teacher {  
  2.     private int id;  
  3.    private String name;  
  4.     private String title;  
  5. }

  1. public class TableData {  
  2.       private String tableName;  
  3.       private List tableData; 
  4. }
  1.  // 將json轉為資料-->start  
  2.         List<TableData> tableDatas2 = gson.fromJson(s,  
  3.                 new TypeToken<List<TableData>>() {  
  4.                 }.getType());  
  5.         for (int i = 0; i < tableDatas2.size(); i++) {  
  6.             TableData entityData = tableDatas2.get(i);  
  7.             String tableName = entityData.getTableName();  
  8.             List tableData = entityData.getTableData();  
  9.             String s2 = gson.toJson(tableData);  
  10.             // System.out.println(s2);  
  11.             // System.out.println(entityData.getData());  
  12.             if (tableName.equals("students")) {  
  13.                 System.out.println("students");  
  14.                 List<Student> retStuList = gson.fromJson(s2,  
  15.                         new TypeToken<List<Student>>() {  
  16.                         }.getType());  
  17.                 for (int j = 0; j < retStuList.size(); j++) {  
  18.                     System.out.println(retStuList.get(j));  
  19.                 }  
  20.   
  21.             } else if (tableName.equals("teachers")) {  
  22.                 System.out.println("teachers");  
  23.                 List<Teacher> retTchrList = gson.fromJson(s2,  
  24.                         new TypeToken<List<Teacher>>() {  
  25.                         }.getType());  
  26.                 for (int j = 0; j < retTchrList.size(); j++) {  
  27.                     System.out.println(retTchrList.get(j));  
  28.                 }  
  29.             }  
  30.         }  
  31.   
  32.         // Json轉為物件-->end 

  • 註冊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;  

自己寫一個轉換器實現JsonSerializer<T>介面和jsonDeserializer<T>介面:

  1. public class EnumSerializer implements JsonSerializer<PackageState>,  
  2.         JsonDeserializer<PackageState> {  
  3.   
  4.     // 物件轉為Json時呼叫,實現JsonSerializer<PackageState>介面  
  5.     @Override  
  6.     public JsonElement serialize(PackageState state, Type arg1,  
  7.             JsonSerializationContext arg2) {  
  8.         return new JsonPrimitive(state.ordinal());  
  9.     }  
  10.   
  11.     // json轉為物件時呼叫,實現JsonDeserializer<PackageState>介面  
  12.     @Override  
  13.     public PackageState deserialize(JsonElement json, Type typeOfT,  
  14.             JsonDeserializationContext context) throws JsonParseException {  
  15.         if (json.getAsInt() < PackageState.values().length)  
  16.             return PackageState.values()[json.getAsInt()];  
  17.         return null;  
  18.     }  
  19.   
  20. }  
  1.   public static void main(String[] args) {  
  2.         GsonBuilder gsonBuilder = new GsonBuilder();  
  3.         gsonBuilder.registerTypeAdapter(PackageState.class,  
  4.                 new EnumSerializer());  
  5.         Gson gson = gsonBuilder.create();  
  6.         PackageItem item = new PackageItem();  
  7.         item.setName("item_name");  
  8.         item.setSize("500M");  
  9.         item.setState(PackageState.UPDATING);// 這個 state是列舉值  
  10.   
  11.         String s = gson.toJson(item);  
  12.         System.out.println(s);  
  13.   
  14.         System.out.println("--------------------------------");  
  15.   
  16.         PackageItem retItem = gson.fromJson(s, PackageItem.class);  
  17.         System.out.println(retItem);  
  18.     }