Retrofit+OkHttp+RxJava数据解析问题

Retrofit+OkHttp+RxJava

Retrofit 负责 请求的数据和请求的结果,使用接口的方式呈现,OkHttp负责请求的过程,RxJava 负责异步,各种线程之间的切换。

在定义接口的时候可以直接返回你想要的数据格式Bean

Retrofit会在返回结果的时候直接将这个格式Bean返还给你

一般情况下后台开发,在同一个接口返回数据的格式的话是统一的:

打个比方:

登录成功接口返回数据

{

    "status": 0,

    "msg": "登录成功!",

    "data": "12345678"

}

登录失败接口返回数据

{

    "status": 999,

    "msg": "登录失败!",

    "data": ""

}

如果是这样是不会出现错误的。

但是我们后台在失败时候返回的数据格式变了。例如:

{

    "status": 999,

    "msg": "登录失败!",

    "data": []

}

data本来是一个String类型突然变成了一个数组类型,这时候就会出现错误

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_STRING but was BEGIN_ARRAY at line 1 column 98 path $.data

这时候我该怎么办,我肯定不能挨个接口去判断,所以我准备从基础下手。

首先我确定了我们的接口status和msg这两个肯定是不会改变的,这两个参数对于所有接口都是通用的参数。

建立Bean

其次解析数据格式的为retrofit的


方法。

通过这句代码去设置一个解析工厂。

so我需要做的就是去重写GsonConverterFactory 在解析返回数据的时候去加个判断

首先定义CustomGsonConverterFactory去继承 Converter.Factory


其次新建CustomGsonResponseBodyConverter实现implements Converter 

responseBodyConverter这个方法是处理ResponseBody的

在convert里面可以拿到ResponseBody

之后ResponseBody解析为公共的AllBean

AllBean判断status是否等于0

如果是的话正常解析就好了

如果不是0的话再将AllBean转成String赋值给response之后去解析

因为AllBean里面的参数是公共的,所以就不会出现解析的异常了

至此问题解决。


自定义可以根据需求在里面写的更详细,我只是记录一下,如果再遇到此类问题,我应该想到的解决方案应该是什么样子,在哪里下手。

你可能感兴趣的:(Retrofit+OkHttp+RxJava数据解析问题)