Gson解析String,com.google.gson.stream.MalformedJsonException

在一个项目中,采用的是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类型,不会出错

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章