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)

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