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



}  
     



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值