关于Retrofit网络请求解析泛型成.LinkedTreeMap的问题,com.google.gson.internal.LinkedTreeMap cannot be cast to com.

本文探讨了使用Retrofit进行网络请求时遇到的泛型解析问题,特别是将响应转换为LinkedTreeMap时出现的类型转换错误。针对这类问题,文章提出了相应的解决策略,帮助开发者更高效地处理后台固定数据结构的解析。

由于后台返回的数据结构是固定的,所以我们定义一个泛型父类来解析比较方便

package com.yblt.hct.bean;

/**
 * Created by yangfan
 * nrainyseason@163.com
 */


public class ResultBean<T> {
//     "header":{
//        "messageID":"88882013041509153412",
//                "timeStamp":"20130415091534",
//                "transactionType":"1001",
//                "sign":"mnx3F2vrUFDvUnT2l8Hnzg"
//    },
//            "body":{
//        "userName":"张三",
//                "password":"123123",
//                "email":"aa@yahoo.com.cn",
//                "mobile":"11111111111"
//    }
    public Header header;
    public Body body;
    public class Header{
        public String messageID;
        public int resCode;
        public String resMsg;
        public long timeStamp;
        public int transactionType;
    }

    public class Body{
        public T list;

        //分页时使用
        public long oprTime;
        public int page;
        public int rowcount;
        public int total;
    }
}


list定义为泛型,使用时在指定类型
package com.yblt.hct.network.api;

import com.yblt.hct.bean.HomeBanner;
import com.yblt.hct.bean.ResultBean;

import java.util.List;

import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import rx.Observable;

/**
 * Created by yangfan on 17/04/24.
 */
public interface AppApi {

    /**
     * 首页banner
     *
     * @param route
     * @return
     */
    @Headers({"Content-Type: application/json","Accept: application/json"})//需要添加头
    @POST("other")
    Observable<ResultBean<List<HomeBanner>>> getBanner(@Body RequestBody route);

}


但是这样拿到的解析出来的数据会把list的类型解析成LinkedTreeMap,
因为java的泛型是从上往下指定 递归模式,因为规定了ResultBean的类型但是list的类型未写入,既然找到了问题,解决办法如下

package com.yblt.hct.bean;

/**
 * Created by yangfan
 * nrainyseason@163.com
 */


public class ResultBean<T> {
//     "header":{
//        "messageID":"88882013041509153412",
//                "timeStamp":"20130415091534",
//                "transactionType":"1001",
//                "sign":"mnx3F2vrUFDvUnT2l8Hnzg"
//    },
//            "body":{
//        "userName":"张三",
//                "password":"123123",
//                "email":"aa@yahoo.com.cn",
//                "mobile":"11111111111"
//    }
    public Header header;
    public Body<T> body;
    public class Header{
        public String messageID;
        public int resCode;
        public String resMsg;
        public long timeStamp;
        public int transactionType;
    }

    public class Body<T>{
        public T list;

        //分页时使用
        public long oprTime;
        public int page;
        public int rowcount;
        public int total;
    }
}


改动地方为 
public Body<T> body;
 public class Body<T>


这样泛型是
ResultBean<T> ---> Body<T> --->  T list


这样就把list的类型指定了,问题也就解决了

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值