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

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

 
 
package com.yblt.hct.bean;

/**
 * Created by yangfan
 * [email protected]
 */


public class ResultBean<T> {
//     "header":{
//        "messageID":"88882013041509153412",
//                "timeStamp":"20130415091534",
//                "transactionType":"1001",
//                "sign":"mnx3F2vrUFDvUnT2l8Hnzg"
//    },
//            "body":{
//        "userName":"张三",
//                "password":"123123",
//                "email":"[email protected]",
//                "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
 * [email protected]
 */


public class ResultBean<T> {
//     "header":{
//        "messageID":"88882013041509153412",
//                "timeStamp":"20130415091534",
//                "transactionType":"1001",
//                "sign":"mnx3F2vrUFDvUnT2l8Hnzg"
//    },
//            "body":{
//        "userName":"张三",
//                "password":"123123",
//                "email":"[email protected]",
//                "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的类型指定了,问题也就解决了

猜你喜欢

转载自blog.csdn.net/hhoo3344521/article/details/80077670