在一個項目中,採用的是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類型,不會出錯