天天看點

關于Gson解析泛型的

1.實際開發中,一般背景傳回的資料

           // data 為 object 的情況

           {"code":"0","message":"success","data":{}}

           // data 為 array 的情況

           {"code":"0","message":"success","data":[]}

2.對于上面的資料,進行JavaBean泛型的抽取

           public ResBean<T>{

                      public String code;

                      public String message;

                      public T data;

           }

3.先了解泛型解析的關鍵

           public interface ParameterizedType extends Type {     

                      // 傳回Map<String,User>裡的String和User,是以這裡傳回[String.class,User.class]    

                      Type[] getActualTypeArguments();     

                      // Map<String,User>裡的Map,是以傳回值是Map.class    

                      Type getRawType();    

                      // 用于這個泛型上中包含了内部類的情況,一般傳回null    

                      Type getOwnerType(); 

           }

4.資料請求後對JavaBean的解析,分兩種情況,Object和List類型。

           public abstract class OKHttpCallback<T>{            

                      public void onSucceed(String json) {

                                 Type genType = this.getClass().getGenericSuperclass();

                                 Type[] params = ((ParameterizedType) genType).getActualTypeArguments();

                                 // 擷取T的類型

                                 // 普通類型

                                 Type actualType = params[0];

                                 // List類型

                                 if (!(actualType instanceof Class)){

                                            Type typeOfT = ((ParameterizedType) actualType).getActualTypeArguments()[0];

                                            Type listType = new ParameterizedTypeImpl(List.class, new Type[]{typeOfT});

                                            // 根據List<T>生成完整的ResBean<List<T>>

                                           actualType = new ParameterizedTypeImpl(ResBean.class, new Type[]{listType});

                                 }

                                 ResBean<T> bean = gson.fromJson(json, actualType);

                                 // 對code判斷後傳回T

                                 T data = bean.data;

                                 // 一般用Handler切換到主線程(這裡隻是寫了關鍵代碼)

                                 onSucceed(data);

                      }

                      public abstract void onSucceed(T data);

}