美文网首页
Retrofit+OkHttp+RxJava数据解析问题

Retrofit+OkHttp+RxJava数据解析问题

作者: 全能超人 | 来源:发表于2018-05-30 19:45 被阅读0次

    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数据解析问题

          本文链接:https://www.haomeiwen.com/subject/zxpxsftx.html