关于Gson解析泛型的

Android 专栏收录该内容
3 篇文章 0 订阅

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
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值