Android使用Retrofit框架时JSON解析出错的解决方案

前言Retrofit 是目前主流的网络请求框架,相信用过的小伙伴都可能会遇到这样的问题,绝大部分接口测试都正常,就个别接口尤其是返回失败信息时报了个奇怪的错误信息,而看了自己的代码逻辑也没什么问题。那是什么原因呢?是后台返回的数据有误吗?还是自己在处理这些失败数据的时候没考虑仔细呢?问题原因后台返回的失败数据不是自己期望的数据格式,比如说,代码中实体bean长这样:public class BaseResponse<T> { private boolean success;
摘要由CSDN通过智能技术生成

前言

Retrofit 是目前主流的网络请求框架,相信用过的小伙伴都可能会遇到这样的问题,绝大部分接口测试都正常,就个别接口尤其是返回失败信息时报了个奇怪的错误信息,而看了自己的代码逻辑也没什么问题。那是什么原因呢?是后台返回的数据有误吗?还是自己在处理这些失败数据的时候没考虑仔细呢?

问题原因

后台返回的失败数据不是自己期望的数据格式,比如说,代码中实体bean长这样:

public class BaseResponse<T> {
   
    private boolean success;
    private String code;
    private String message;
    private T data;
}

正常返回正确的情况下,服务器返回的data数据是JSON字符串,T 就很顺利的转换成我们对应的回调实体bean;但当正常返回失败的情况下,服务器的回调可能就长这样:

{
   
  "success": false,
  "code":1001,
  "message": "登录失败",
  "data": []
}

怎么办,这时候我们的程序就会报一个 Net_OnError:java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 44 path $.data 这样的JSON解析错误的bug了,皆因服务器返回的 data 是一个空数组,不再是JSON字符串的格式,那么如何解决呢?

解决方案

1.最直接的办法:找后台开发的同事交流沟通一下,把 [] (空数组)或者其他数据类型改成 {} (空JSON字符串)类型,再返回给我们,这时候就可以解决这个JSON解析错误的问题了。
2.自行解决方案:加请求拦截器,在JSON数据解析之前把格式给改了,也可以解决这个问题。

自行解决具体方案

以下是参考 Android 优雅地处理后台返回的骚数据 这篇文章的,实测有效。
(1)写一个抽象请求回调体的拦截器:

public abstract class ResponseBodyInterceptor implements Interceptor {
   

    @NotNull
    @Override
    public Response intercept(@NotNull Chain chain) throws IOException {
   
        Request request = chain.request();
        String url = request.url()
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值