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

    }

}

 
 
 
 
 
 
發佈了32 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章