Retrofit返回數據不是Json,返回String或Bytes;MalformedJsonException: Use JsonReader.setLenient(true)異常解決;

使用Retrofit接收的數據一直是Json,這次遇到了一個返回數據不是Json的,Gson解析當場報錯:com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 17 path $.forumbits[0]

    @GET("login/base/getCode")
    Observable<Object> getVerificationCode(@Query("state") String state);

我就相當鬱悶,我都用Object接收數據了,還有問題?

於是我就打開Postman看一下這個接口到底返回的是什麼,Postman給我的返回結果直接是一張圖片;大喫一驚!這不符合邏輯呀還能返回一張圖片,研究一下發現其實返回的是個bytes數組,Postman直接轉成圖片了;於是我找到了後臺開發人員:

我:這個接口有問題呀,怎麼直接返回一張圖片;

後臺:嗯,這個接口就是這樣的;

我:能不能改一下,返回一個圖片的Url;

後臺:這是老接口,改不了;

結束!!!

1、在網上扒拉一圈這個錯誤,有人說“BaseUrl結尾必須是/”,這玩意回答的牛頭不對馬嘴;有人說把接收類型改爲JsonObject,必須是com.google.gson包下面的,不能是JSONObject;

這個可以試一下:

    @GET("login/base/getCode")
    Observable<JsonObject> getVerificationCode(@Query("state") String state);

結果還是報錯;

2、於是我就不用Retrofit了,直接上Okhttp訪問網絡,哎你別說,這個還可行;當場就把bytes數組取出來了;可是感覺太好,其它地方用的都是Retrofit,又研究一番發現Okhttp接收的參數是:Response格式,想着用Response接收一下,發現了這個:

@GET("login/base/getCode")
    Observable<ResponseBody> getVerificationCode(@Query("state") String state);

完美!!!

ResponseBody可以直接接收返回數據,然後ResponseBody.bytes()就可以取出bytes數組,ResponseBody.string()可以直接取出String;

好了,就這樣把:使用ResponseBody接收Retrofit返回非Json的數據;接收(string、bytes)

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