精华内容
下载资源
问答
  • Gson解析泛型T的数据

    千次阅读 2020-08-31 17:17:14
    Gson解析泛型T的数据 Gson解析泛型的数据有两种情况,一个是解析泛型对象,一个是解析泛型的List。 1.解析泛型对象 先要自定义一个类实现ParameterizedType这个接口中的方法 public class GsonTypeTokenObjectUtils ...

    Gson解析泛型T的数据

    Gson解析泛型的数据有两种情况,一个是解析泛型对象,一个是解析泛型的List。

    1.解析泛型对象

    先要自定义一个类实现ParameterizedType这个接口中的方法

    public class GsonTypeTokenObjectUtils implements ParameterizedType {
    
    
        private final Class raw;
        private final Type[] args;
    
        public GsonTypeTokenObjectUtils(Class raw, Type[] args) {
            this.raw = raw;
            this.args = args != null ? args : new Type[0];
        }
        @Override
        public Type[] getActualTypeArguments() {
            return args;
        }
        @Override
        public Type getRawType() {
            return raw;
        }
        @Override
        public Type getOwnerType() {return null;}
    
    
    
    }
    

    然后再调用Type类中的一些方法

    
        /**
         * {
         * code:0
         * data:{}
         * }
         * 返回的json格式是这种的时候,调用此方法
         */
        public LiveData<BaseModel<T>> jsonObjectToModel(Class clazz) {
            return Transformations.switchMap(liveData, json -> {
                MutableLiveData<BaseModel<T>> mutableLiveData = new MutableLiveData<>();
    
                Type type = getClass().getGenericSuperclass();
                Type[] types = ((ParameterizedType) type).getActualTypeArguments();
                Type ty = new GsonTypeTokenObjectUtils(BaseModel.class, new Type[]{types[0]});
                BaseModel<T> response = new Gson().fromJson(json,
                        ty);
    
                mutableLiveData.postValue(response);
                return mutableLiveData;
            });
        }
    

    1.解析泛型List

    首先也是要自定义一个类去实现ParameterizedType接口

    public class GsonTypeTokenListUtils implements ParameterizedType {
    
    
        private Class aClass;
    
        public GsonTypeTokenListUtils(Class aClass){
            this.aClass = aClass;
        }
    
    
        @NonNull
        @Override
        public Type[] getActualTypeArguments() {
            return new Type[]{aClass};
        }
    
        @NonNull
        @Override
        public Type getRawType() {
            return List.class;
        }
    
        @Nullable
        @Override
        public Type getOwnerType() {
            return null;
        }
    }
    
    

    然后再调用Gson解析的方法

        /**
         * {
         * code:0
         * data:[]
         * 必须取出data数组字符串,单独的解析,不能整体解析
         * }
         * 返回的json格式是这种的时候,调用此方法
         */
        public LiveData<List<T>> jsonArrayToModel(Class clazz) {
            // 解决 java.lang.AssertionError: illegal type variable reference
            // 方法:自定义一个ParameterizedType类,还有注意json只有你要解析的数组字符串,不能有其他
            return Transformations.switchMap(liveData, json -> {
                MutableLiveData<List<T>> mutableLiveData = new MutableLiveData<>();
                try {
                    JSONObject jsonObject = new JSONObject(json);
                    JSONArray jsonArray = jsonObject.getJSONArray("data");
                    List<T> response = parseString2List(jsonArray.toString(), clazz);
                    mutableLiveData.postValue(response);
    
                } catch (JSONException e) {
                    e.printStackTrace();
                }
    
                return mutableLiveData;
            });
        }
    
    
        private <T> List<T> parseString2List(String json, Class clazz) {
            Type type = new GsonTypeTokenListUtils(clazz);
            List<T> list = new Gson().fromJson(json, type);
            return list;
        }
    
    
    
    
    展开全文
  • gson 解析泛型和将泛型转为json字符串
  • 当用Gson解析泛型会报以下错误: com.google.gson.internal.LinkedTreeMap cannot be cast to

    当用Gson解析泛型会报以下错误:

    com.google.gson.internal.LinkedTreeMap cannot be cast to

    解决办法:

    private Class<T> className;
    public List<T> fromJsonList(String json) {
        List<T> mList = new ArrayList<T>();
        Gson gson = new Gson();
        JsonArray array = new JsonParser().parse(json).getAsJsonArray();
        log.debug("className: " + className);
        for(final JsonElement elem : array){
            mList.add(gson.fromJson(elem, className));
        }
        return mList;
    }
    展开全文
  • Gson解析泛型

    2019-11-19 10:52:35
    最近做一个网络请求框架切换类,为了方便在网络请求回调的时候直接解析成含有泛型的bean或list,研究了一下如何用gson解析,经本人测试不管直接解析泛型、解析带泛型的bean,还是解析list、解析带泛型bean的list,都...

           最近做一个网络请求框架切换类,为了方便在网络请求回调的时候直接解析成含有泛型的bean或list,研究了一下如何用gson解析,经本人测试不管直接解析泛型、解析带泛型的bean,还是解析list、解析带泛型bean的list,都可以

    直接上代码

     

    public abstract class ICallBack {
    
        abstract void success(String result);
    
        abstract void error(String error);
    }
    public abstract class IGsonCallBack<Result> extends ICallBack {
        @Override
        public void success(String result) {
            Gson gson = new Gson();
            ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
            Type[] types = type.getActualTypeArguments();
            JsonReader jsonReader = new JsonReader(new StringReader(result));
            success((Result) gson.fromJson(jsonReader, types[0]));
        }
    
        public abstract void success(Result result);
    
        @Override
        public abstract void error(String error);
    
    }
     

     

    展开全文
  • Gson解析泛型 解析方式: 一、 应用场景:除接口外其他类,获取泛型类型,进行解析。混淆时需要keep 此类。 泛型Type/Class获取 Type t = mBaseEntity.getClass().getGenericSuperclass(); Type claz = (...

    Gson解析泛型

    解析方式:
    一、
    应用场景:除接口外其他类,获取泛型类型,进行解析。混淆时需要keep 此类。

    泛型Type/Class获取

    Type t = mBaseEntity.getClass().getGenericSuperclass();
    Type claz = ((ParameterizedType) t).getActualTypeArguments()[0];
    Class claz = mBaseEntity.getResultType();
    

    解析

    T mResponse = new Gson().fromJson(body, claz);
    

    二、
    应用场景:接口中的泛型,获取泛型类型,进行解析。混淆时需要keep 此接口。

    接口

        public interface CssCallback<T> {
            void onResponse(T mResponse);
    
            void onFailure(Call<?> call, Throwable t);
        }
    

    泛型Type/Class获取

    //Class<T>tClass=null;//根据当前类获取泛型的
    TypeTypetypeOfT=null;Type[]interfacesTypes=null!=mCallback?mCallback.getClass().getGenericInterfaces(): null;
    
    if(null!=interfacesTypes){
    	for(Typet: interfacesTypes){
    		Type[]genericType2=((ParameterizedType)t).getActualTypeArguments();
    		//接口有几个泛型参数,genericType2size一般就为几。
    		for(Typet2: genericType2){
    			//tClass=(Class<T>)t2;typeOfT=t2;
    		}
    	}
    }
    

    解析

    /*if(null!=tClass){
    	mResponse=(T)newGson().fromJson(body,tClass);
    }*/
    if(null!=typeOfT){
    	T mResponse=newGson().fromJson(body,
    	typeOfT);
    }
    

    三、
    应用场景:均可使用,但混淆时无法使用,无论是否忽略类接口泛型混淆都不行。

    泛型类型获取

    Class claz=null;
    Method[]ms=null!=mCallback?mCallback.getClass().getDeclaredMethods(): null;
    if(null!=ms){
    	for(Methodm: ms){
    		if(!TextUtils.equals(null!=m?m.getName(): "","onResponse"))continue;
    		Class[]paramTypes=null!=m?m.getParameterTypes(): null;
    		if(null!=paramTypes
    		&&paramTypes.length==1
    		&&BaseEntity.class.isAssignableFrom(paramTypes[0])){
    			claz=paramTypes[0];
    			if(!claz.isAssignableFrom(CssCallback.class)){
    				break;
    			}
    		}
    	}
    }
    

    解析

    if(null!=claz){
    T mResponse=(T)newGson().fromJson(body,claz);
    }
    

    总结:
    因为Android release打包时正常都会对代码进行混淆,所以方法三基本可以废弃,在方法一和方法二中自由选择,注意使用场景。两个方法的本质区别是getGenericSuperclass()getGenericInterfaces()

    接口中泛型混淆问题

        public interface CssCallback<T> {
            void onResponse(T mResponse);
    
            void onFailure(Call<?> call, Throwable t);
        }
    

    如上接口包含有泛型,混淆时添加接口keep,泛型keep,使用方法三获取泛型类型并解析,但泛型始终会被定义成Object,解析失败。

    混淆配置

    
    # 避免混淆泛型
    -keepattributes Signature
    

    外部接口

    -keep public interface com.XXX.XXX.XXX.CssCallback{ *; }
    

    内部接口

    -keep public interface com.XXX.XXX.XXX.RequestManager$CssCallback{ *; }
    
    展开全文
  • Gson解析泛型对象失败的解决方案

    千次阅读 2017-09-07 20:52:47
    com.google.gson.internal.StringMap cannot be cast to xxx;Gson解析泛型对象失败的解决方案
  • 比如需要填入的对象 class A<T>{ public T aaa; } 用Gson解析的时候 已经指定了T的类型是另一个实体类,但是解析出来的 “aaa” 是一个串String
  • 泛型使用方式,分别为:泛型类、泛型接口、泛型方法。 ①泛型类,泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。 泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔...
  • gson解析泛型数据

    2017-05-24 20:11:44
    public class BaseResponseBean {  private Integer code;  private String msg;... private T data;  public Integer getCode() {  return code;  }  public void setCode(Integer c
  • gson解析泛型对象

    2015-03-22 09:32:18
    主要涉及:T的class的获取,gson解析jsonarray package test.gson; abstract public class BaseDao { abstract public Object parse(String json); } package test.gson; import java.lang.reflect....
  • 关于Gson解析泛型

    2017-10-12 09:21:27
    1.实际开发中,一般后台返回的数据 // data 为 object 的情况 {"code":"0","message":"success","data":{}} // data 为 array 的情况 ...2.对于上面的数据,进行JavaBean泛型的抽取 public ResBean{ public
  • 常用的复杂对象的gson解析方式: Type listType = new TypeToken<ArrayList> () {}.getType(); 但这一次我需要实现对 Type listType = new TypeToken<ArrayList> () {}.getType();的解析, 当我传入泛型...
  • GSON解析泛型json 封装通用类

    千次阅读 2018-08-27 10:50:56
    根据这位大神的思路,结合现有Gson(版本2.8.5)进行泛型实体类简单封装 本文章只针对 #第一种: {"success":true,"data":{"averageStarLevel":4.7,"remarkCount":10}}...
  • 使用Gson解析泛型类型

    千次阅读 2016-05-21 22:56:02
    如果我们直接用Gson解析的话,要有对应的实体类才行,比如要解析上面的两个Json的话,就要有两个类 public class UsreInfoBean { public String result_code; public String result_msg; public ...
  • } } 然后创建一个泛型实体类解析数据 BaseClass public class BaseClass{ private int total; private int per_page; private int current_page; private int last_page; private List data; public int getTotal...
  • 如何使用gson解析泛型形参并返回相对应的类 在android实际开发中,我们在请求网络数据的时候,服务器返回的通常都是json字符串,我们需要将json转化成我们需要的类,当然这些通常是使用gson来完成的,过程大概就是...
  • 参考://public static class paraJson {public class paraJson{ static Gson gson = new GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();// static Gson g...
  • ...ResultBean即为自定义的泛型中具体的数据实体类,此时数据就都已经解析到 reportBean 里面了,再根据自己的需要取出即可。   转载于:https://www.cnblogs.com/Sharley/p/8954055.html

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,985
精华内容 1,194
关键字:

gson解析泛型t