retrofit/Okhttp 返回Json进行多层泛型解析

解析json格式:

{

"success": "SUCCESS",

"errorCode": null,

"data": {

"total": 17,

"totalPage": 2,

"items": [{

"piciId": "f3d6d826-ec2a-470d-a44f-4d66a0428be9",

"departmentNo": "22",

"departmentName": "德邦物流"

}, {

"piciId": "b0903f13-63f7-4a76-a60f-dbf0cb5e9a7f",

"departmentNo": "22",

"departmentName": "德邦物流"

}]

}

}


对应解析成的实体结构 MyResponse<CarrierInfoResult<CarrierInfoBean>>


MyResponse、CarrierInfoResult:

public class MyResponse {

public String success;

public String errorCode;

public String message;

public T data;

@Override

public String toString() {

return "MyResponse{" +

"success='" + success + '\'' +

", errorCode='" + errorCode + '\'' +

", message='" + message + '\'' +

", data=" + (data!=null?data.toString():"null") +

'}';

}

}

public class CarrierInfoResult {

public int total;

public int totalPage;

public List items;

@Override

public String toString() {

return "CarrierInfoResult{" +

"total=" + total +

", totalPage=" + totalPage +

", items=" + (items!=null?items.toString():"null") +

'}';

}

}


CarrierInfoBean:具体实体类


retrofit 返回值解析


public void onResponse(Call call, Response response) {

if(listener!=null){

try {

//返回的json MyResponse{success='SUCCESS', errorCode='null', message='null', data=CarrierInfoResult{total=0, totalPage=0, items=[]}}

//这是需要解析的最终对象结构 :MyResponse>

Gson gson = new Gson();

Type type = new TypeToken>() {}.getType();

Log.e(TAG, "onResponse: 第1层泛型解析");

MyResponse myResponse =  gson.fromJson(response.body().string(),type);

if("SUCCESS".equals(myResponse.success)){

Log.e(TAG, "onResponse: 第2层泛型解析");

Type type2 = new TypeToken>() {}.getType();

CarrierInfoResult data2 =  gson.fromJson(gson.toJson(myResponse.data),type2);

//赋值回返回值

myResponse.data =data2;

}

Log.e(TAG, "onResponse: "+  myResponse.toString());

} catch (IOException e) {

e.printStackTrace();

}

}

}


引发原因:泛型擦除导致。无上下界的泛型 xxx<T> ,   在编译后的class文件中,都会变成xxx<Object>,导致json解析时无法获取到对应泛型的类型参数,所以无法正常解析。通过TypeToken的转换,其实用new TypeToken<>{}就是在新建立一个静态内部类,存储对应泛型类型,使Gson在编译后依旧可以拿到对应类型进行解析。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341