在一个项目中,采用的是OkHttp+Retrofit+Rx写的,数据解析用的是Gson,最外层泛型
/**
* Created by ZhuHui on 2018/8/9.
* 返回的网络数据外层
*/
public class ObjResponse<Result> {
public int rc;
public String msg;
public Result ret;
public String err;
}
登录时候使用的类,比如说是UserData,那写法就是ObjResponse<UserData>,一般接口就是
Observable<ObjResponse<UserData>> login();
开始用的好好的,后台说要加session,登录后从头解析,我就把写法改成了
Observable<Response<ObjResponse>> login();
在获取到的data里
ObjResponse response = data.body;
if(response.rc == 0) {
String result = response.rec.toString;
Gson gson = new Gson;
UserData userData = gson.fromJson(result, UserData.class);
//将userData存入SharedPreference中
}
Gson转换数据那边包裹一个try-catch,catch里userData = null 登录先前的账户OK,没问题,可是隔两天测试跟我说登录后闪退,调试后发现,Gson转换不成功,异常:com.google.gson.stream.MalformedJsonException: Unexpected value at line 1 column 247 path $.phone
每个人碰到这个异常的情况不一样,有可能是类型写错的原因,我检查了下返回的数据和我的类型,发现没有出错,对比了下phone那个数据,后台返回的是 "phone": "",看着也没什么问题,那应该就是toString那里了,因为之前在一个老项目,一个接口返回的数据格式有五六种,之前的写法就是这样,拿到了数据toString,然后再用Gson解析成对应的实体,但是里面数据都是有的。在"phone": ""toString后会变成,{phone=,},导致解析失败。
解决办法:本地的话可以解析之前就做处理,或者直接转换成JsonObject
服务器的话,就和最开始一样,再把UserData加上就行了
Observable<Response<ObjResponse<UserData>>> login
data.body.rec就是UserData类型,不会出错