美文网首页
使用Gson结合泛型解析数据

使用Gson结合泛型解析数据

作者: 资本家大恶人 | 来源:发表于2020-07-20 17:04 被阅读0次

使用Gson结合泛型解析数据时,用到了这么一个方法 parameterizedType.getActualTypeArguments()[0]
那么它是什么意思呢?

                            T model = null;
                            try {
                                Gson gson = new Gson();
         //ParameterizedType代表的是一个泛型的实例
       ParameterizedType parameterizedType = (ParameterizedType) requestCallBack.getClass().getGenericInterfaces();//得到范型化参数
                                Type type = parameterizedType.getActualTypeArguments()[0];//获得超类的泛型参数的实际类型
                                model = gson.fromJson(result, type);
                                requestCallBack.onSuccess(result, model);
                            } catch (JsonSyntaxException e) {
                                requestCallBack.OnFailure(e);
                            }

getClass().getGenericSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type,然后将其转ParameterizedType。
getActualTypeArguments()返回表示此类型实际类型参数的 Type 对象的数组。
[0]就是这个数组中第一个了,简而言之就是获得超类的泛型参数的实际类型。
本例中即为获得T的type。


public class Test {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();

        Person person = new Person();
        person.setId(1);
        person.setName("1");

        Person person1 = new Person();
        person.setId(3);
        person.setName("w");

        Person person2 = new Person();
        person.setId(4);
        person.setName("4");

        list.add(person);
        list.add(person1);
        list.add(person2);

        String s = new Gson().toJson(list);
        System.out.println(s);
        doPost(new IBaseCallBack<List<Person>>() {
            @Override
            public void onSuccess(List<Person> data) {

            }

            @Override
            public void onFail(String error) {

            }
        }, s);
    }


    public static <T> void doPost(IBaseCallBack<T> callBack, String json) {
        //IBaseCallBack<List<Person>>
        Type[] types = callBack.getClass().getGenericInterfaces();//得到范型化参数
        ParameterizedType parameterizedType = (ParameterizedType) types[0]; // 得到范型化参数的实体
//       String callType = parameterizedType.getRawType().toString();
        ParameterizedType callBackParamterize = (ParameterizedType) parameterizedType.getActualTypeArguments()[0];//得到具体bean类
    }

    /**
     * @param json json字符串
     * @param type
     * @param <T>
     * @return
     * @throws Exception
     */
    public static <T> T convert(String json, Type type) throws Exception {

/**
 * 1. 将type强转为ParameterizedType范型参数的实体
 * 2.  getRawType()返回<>之外 判断是否为list
 * 3. 得到该实体的具体对象
 * 4.对象实例化
 * 5.通过创建空的JSONObject将得到的JSONArray的数据依次遍历
 * 6.通过json的key值得到value
 * 7。
 */
        //List<T>
        if (type instanceof ParameterizedType) {

            Class aClass = (Class) ((ParameterizedType) type).getRawType();


            if (aClass == List.class) {
                ArrayList list = new ArrayList();

                Class personClass = (Class) ((ParameterizedType) type).getActualTypeArguments()[0];

                JSONArray jsonArray = new JSONArray(json);
                JSONObject object;
                for (int i = 0; i < jsonArray.length(); i++) {

                    Object person = personClass.newInstance();

                    object = jsonArray.getJSONObject(i);

                    Iterator<String> keys = object.keys();


                    String key;
                    while (keys.hasNext()) {
                        key = keys.next(); //id
//得到对象
                        Field field = personClass.getDeclaredField(key);
//可以访问到该类中的私有(private)成员变量
                        field.setAccessible(true);
//        给该对象赋值
                        field.set(person, object.get(key));
//完成一个对象的取值
                    }
//                    将赋值后的对象存入集合
                    list.add(person);
                }
//返回该集合
                return (T) list;

            }

        }

        return null;
    }

}

相关文章

  • parameterizedType.getActualTypeA

    使用Gson结合泛型解析数据时,用到了这么一个方法 parameterizedType.getActualType...

  • 使用Gson结合泛型解析数据

    使用Gson结合泛型解析数据时,用到了这么一个方法 parameterizedType.getActualType...

  • 使用Gson的一些感悟——解析复杂json

    使用Gson的一些感悟——解析复杂json 将json解析为泛型对象时,发现Gson有种很特别的写法,因此学习了下...

  • Android Gson 解析泛型报错

    当用Gson解析泛型会报以下错误: com.google.gson.internal.LinkedTreeMap ...

  • Gson解析泛型数据

    解析BaseBean格式泛型数据 class Business{ private String descri...

  • Gson解析泛型数据类型

    Gson解析泛型类型:Res Type type = new TypeToken(){}.getTyp...

  • Gson解析泛型

    做网络请求的时候肯定要封装回调,我这里就传了泛型,但是出了个问题是Gson没办法直接解析泛型,如果直接解析的话,不...

  • gson解析泛型

    list = gson.fromJson(jsonString,newTypeToken>(){}.getType...

  • Gson解析泛型

    1、json对应的model是T 2、json对应的model是List 3、json对应的model是 m...

  • GSON

    需要掌握的知识点 GSON的基本用法 属性重命名 @SerializedName 注解的使用 GSON使用泛型 利...

网友评论

      本文标题:使用Gson结合泛型解析数据

      本文链接:https://www.haomeiwen.com/subject/iqjykktx.html