retrofit请求网络时,针对泛型解析…

使用retrofit2.0请求网络数据时

实现Callback接口时,在onResponse方法中response返回json串格式如下:

{

    "result": 1,

    "data": {

        "user_id": "2421",

        "user_name": "",

        "user_avatar": "",

        "user_sex": "women",

        "user_password": "9170f642214017d7",

        "user_password_old": "9170f642214017d7",

        "user_quiz": "",

        "user_answer": "",

        "user_email": "",

        "user_mobile": "18610128130",

        "user_ctime": "2016-01-11 14:10:36",

        "user_mtime": "2016-01-13 16:58:42",

        "user_ip_login": "",

        "user_time_login": "2016-01-13 14:19:58",

        "user_ip_reg": "221.221.234.229",

        "user_from_uid": "1744",

        "user_status": "online",

        "user_email_id": "",

        "user_mobile_id": "19b3a6d6c4ae236d675e2a2a5c4fa3e6",

        "user_email_verify": "0",

        "user_mobile_verify": "0",

        "user_extid": "0",

        "user_gz_id": "116"

    },

    "msg": "请求成功"

}

 

由于在定义的BaseResponse类中data的类型是泛型,是在运行时动态给定的,所以gson解析时如果data对应的是jsonObject则会解析成LinkedTreeMap,如果是JsonArray则会解析成ArrayList

public class BaseResponse<</span>T> {

    public int result;
    public String msg;
    public T data;
}

 

因此,在用到data对应的数据时,需要重新将linkedTreeMap解析成Bean对象,或者将ArrayList解析成ArrayList

所以,自定义了一个类,用反射的方式,实现解析:(ArrayList解析成ArrayList)

 

package com.example.administrator.mydemol.util;

 

import com.google.gson.internal.LinkedTreeMap;

 

import java.lang.reflect.Field;

import java.util.ArrayList;

 

import timber.log.Timber;

 

public class Convert2Bean {

public static ArrayList convert(Class bean,ArrayList list){

 

 

ArrayList result = new ArrayList<>();

//获取bean对象内的属性:

Field[] fields = bean.getDeclaredFields();

//循环遍历list,获取linkedTreeMap

for(int i=0;i

LinkedTreeMap map = (LinkedTreeMap) list.get(i);

try {

T instance = (T) bean.newInstance();

for(Field field : fields)

{

Timber.e("===field=="+field.getType());

Timber.e("==="+(field.getType()==String.class));

field.setAccessible(true);

field.set(instance, map.get(field.getName()));

}

result.add(instance);

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

}

return result;

}

}

 

 

 

BaseCallBack.java:

public abstract class BaseCallback implements Callback {



    protected onRequestListener onRequestListener;

    public BaseCallback(onRequestListener onRequestListener) {

        this.onRequestListener = onRequestListener;
        onRequestListener.onRequestStart();
    }



    @Override
    public void onResponse(Response response) {

//        Timber.e(response.code() + "," + response.body().toString());
        if (null != onRequestListener) {

            onRequestListener.onRequestFinish();
        }

        int responseCode = response.raw().code();
        if (200 == responseCode) {

            BaseResponse baseResponse = new Gson().fromJson(response.body().toString(), new TypeToken() {

            }.getType());
            Timber.e("==="+baseResponse.data.toString());
            if (Constants.CODE_SUC == baseResponse.result) {

                onSuccess(baseResponse.data);
            } else if (Constants.CODE_FAILURE == baseResponse.result) {

                onFailure(baseResponse.result, baseResponse.msg);
            } else {

                onFailure(0, "未知异常");
            }

        } else {

            onFailure(responseCode, response.raw().message());
        }

    }



    @Override
    public void onFailure(Throwable t) {

        if (null != onRequestListener) {

            onRequestListener.onRequestFinish();
        }

        onFailure(0, t.getMessage());
    }



    public abstract void onSuccess(Object t);


    public void onFailure(int code, String msg) {

        if (null != onRequestListener) {

            onRequestListener.onFailure(code, msg);
        }

    }

}

 
 
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值