天天看点

关于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);

}