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

    2015-10-30 14:50:53
    泛型在较大的项目中经常会用到,这里放出一个自己写的例子,用gson解析泛型和将泛型转换为json string。 代码下载

    泛型在较大的项目中经常会用到,这里放出一个自己写的例子,用gson解析泛型和将泛型转换为json string。

    代码下载

    展开全文
  • gson 解析泛型和将泛型转为json字符串
  • 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解析泛型错误

    2017-09-25 16:19:16
    GSON解析泛型错误

    错误日志:com.google.gson.internal.LinkedTreeMap cannot be cast to

    原因:泛型擦除,类型转换失败。

    解决:

     List<D> o = gson.fromJson(inputdata + "", getTypeToken().getType());
    
     protected TypeToken getTypeToken(){
            return new TypeToken<D>(){};

    getTypeToken()要返回确定的类型,可以通过子类继承重写D为确定的类。

    展开全文
  • 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解析泛型会报以下错误: com.google.gson.internal.LinkedTreeMap cannot be cast to
  • Gson解析泛型对象失败的解决方案

    千次阅读 2017-09-07 20:52:47
    com.google.gson.internal.StringMap cannot be cast to xxx;Gson解析泛型对象失败的解决方案
  • 如何使用gson解析泛型形参并返回相对应的类 在android实际开发中,我们在请求网络数据的时候,服务器返回的通常都是json字符串,我们需要将json转化成我们需要的类,当然这些通常是使用gson来完成的,过程大概就是...
  • 在项目中使用了Rxjava+Retrofit 作为网络框架,在使用中遇到遇到Gson无法解析泛型,出现ClassCastException。从代码看这个问题是由于Gson 拿不到我们要它解析的那个实体类的类型。本质上时因为Java的泛型擦除机制...
  • 泛型使用方式,分别为:泛型类、泛型接口、泛型方法。 ①泛型类,泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。 泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔...
  • 比如需要填入的对象 class A<T>{ public T aaa; } 用Gson解析的时候 已经指定了T的类型是另一个实体类,但是解析出来的 “aaa” 是一个串String
  • Gson解析泛型的集合

    千次阅读 2018-07-02 19:30:13
    使用json数据时,有时像List类型含有泛型,当解析json时,想把泛型类型带上 Gson gson = new Gson(); gson.fromJson(json, Type); 上面的Type若是一个List怎么表示? Type type = new TypeToken&lt;List&...
  • 常用的复杂对象的gson解析方式: Type listType = new TypeToken<ArrayList> () {}.getType(); 但这一次我需要实现对 Type listType = new TypeToken<ArrayList> () {}.getType();的解析, 当我传入泛型...
  • gson解析泛型数据

    2017-05-24 20:11:44
     /** 参照:搞定Gson泛型封装 http://www.jianshu.com/p/d62c2be60617 */  public static class ParameterizedTypeImpl implements ParameterizedType {  private final Class raw;  private final Type[]...
  • GSON解析泛型json 封装通用类

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

    2017-10-12 09:21:27
    1.实际开发中,一般后台返回的数据 // data 为 object 的情况 {"code":"0","message":"success","data":{}} // data 为 array 的情况 ...2.对于上面的数据,进行JavaBean泛型的抽取 public ResBean{ public
  • 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....
  • VolleyLib框架是一个集合Volley 网络通讯库, Gson解析库 ,org.apache.http部分源码的定制化网络框架 , 具备文件上传、文件下载、Form表单、Json数据协议、Gson 解析Json生成泛型实体等功能。 在实际开发中,网络...
  • 使用Gson解析泛型类型

    千次阅读 2016-05-21 22:56:02
    如果我们直接用Gson解析的话,要有对应的实体类才行,比如要解析上面的两个Json的话,就要有两个类 public class UsreInfoBean { public String result_code; public String result_msg; public ...

空空如也

空空如也

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

gson解析泛型