1. 程式人生 > >Gson+retrofit解析同一位置不同型別的json資料

Gson+retrofit解析同一位置不同型別的json資料

public Object convert(ResponseBody value) throws IOException {
        //ResponseData中的流只能使用一次,我們先將流中的資料讀出在byte陣列中。這個方法中已經關閉了ResponseBody,所以不需要再關閉了
        byte[] valueBytes = value.bytes();
        JsonReader jsonReader = null, errorJsonReader = null;
        try {//try中的為正常流程程式碼
            InputStreamReader charReader = new InputStreamReader(new ByteArrayInputStream(valueBytes), "UTF-8");//後面的charset根據服務端的編碼來定
            jsonReader = gson.newJsonReader(charReader);//原來是使用value.charStream
            Object obj = adapter.read(jsonReader);

            handlerTokenTimeOut(obj);
            return obj;
        } catch (JsonSyntaxException e) {//當catch到這個錯誤說明gson解析錯誤,基本肯定是服務端responseData的問題,此時我們自己解析
            InputStreamReader errorReader = new InputStreamReader(new ByteArrayInputStream(valueBytes), "UTF-8");//後面的charset根據服務端的編碼來定
            errorJsonReader = gson.newJsonReader(errorReader);

            MResponse errorResponse = new MResponse();
            errorResponse.responseData = null;//設為null

            errorJsonReader.beginObject();
            while (errorJsonReader.hasNext()) {
                String nextName = errorJsonReader.nextName();
                if ("responseCode".equals(nextName)) {
                    errorResponse.responseCode = errorJsonReader.nextString();
                } else {
                    errorJsonReader.skipValue();//跳過所有其他的值
                }
            }
            errorJsonReader.endObject();

            handlerTokenTimeOut(errorResponse);
            return errorResponse;
        } finally {
            if (jsonReader != null)
                jsonReader.close();
            if (errorJsonReader != null)
                errorJsonReader.close();
        }
    }
至此,全域性的不同型別的json解析也完成了,如果有大神有更好的解決方式盼請指教啦~~