解析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在编译后依旧可以拿到对应类型进行解析。