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類型,不會出錯

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