使用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);
}
}
}