自定義Gson容錯解析器主要用于兩個目的:
1.在統一的返回json格式中,可以在gsonAdapter就實現預處理,如code返回不是0就可拋出自定義異常,這樣就無須在Retrofit中的回調中再每次去判斷。
2.某些公司的后臺(特別是javaWeb)在返回字段為空時,返回 "" 導致的gson解析異常.從而影響正常App開發
參考Gson: com.squareup.retrofit2:converter-gson 的源碼,就很容易發現底層邏輯還是比較簡單的,只需按照自己的需求重寫這3個GsonRequestBodyConverter 、GsonResponseBodyConverter、 GsonConverterFactory就ok了。只是需要注意一點:常常我們重寫最多的類是GsonResponseBodyConverter,其中value一定要先保存下來,讀取一次就沒了, 二次讀取為空(可參考示例)完整的代碼:https://github.com/MyAndroidP/Gson-adapter
@Override
public T convert(ResponseBody value) throws IOException {
try {
String response = value.string();
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(response);
} catch (JSONException e) {
e.printStackTrace();
}
String message = jsonObject.optString("message", "老接口");
JsonReader jsonReader = null;
MediaType mediaType = value.contentType();
Charset charset = mediaType != null ? mediaType.charset(UTF_8) : UTF_8;
InputStream inputStream = new ByteArrayInputStream(response.getBytes());
jsonReader = gson.newJsonReader(new InputStreamReader(inputStream, charset));
if (message.equals("老接口")) {
int code = jsonObject.optInt("result");
if (code != 1) {
value.close();
String msg = jsonObject.optJSONObject("data").optString(
"errorMessage").contains("在另一臺手機登錄") ? "賬戶登錄異常,請重新登錄" : jsonObject.optJSONObject("data").optString(
"errorMessage");
throw new CustomException(code, jsonObject.optJSONObject("data").optInt(
"errorCode"), msg);
} else {
return adapter.read(jsonReader);
}
} else {
int code = jsonObject.optInt("code");
if (code != 0) {
value.close();
throw new CustomException(code, message.contains("在另一臺手機登錄")?"賬戶登錄異常,請重新登錄":message);
} else {
System.out.println(response);
return adapter.read(jsonReader);
}
}
} finally {
value.close();
}
}