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里面的参数是公共的,所以就不会出现解析的异常了
至此问题解决。
自定义可以根据需求在里面写的更详细,我只是记录一下,如果再遇到此类问题,我应该想到的解决方案应该是什么样子,在哪里下手。