IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> ratrofit +okhttp + gson 解析数据为空 (接口已返回json数据) -> 正文阅读

[移动开发]ratrofit +okhttp + gson 解析数据为空 (接口已返回json数据)

这真是个无语的问题,我先是以为接口数据格式变了,但是我检查了json,发现没有问题,有把所有的字段对了一遍,命名也没有问题,然后就开始打断点,把request和response都打印了一遍,发现response里的解析的body确实是空的,然后就去找解析的位置,因为使用了ratrofit + okhttp + gson的框架结构,于是在okhttpCall的enqueue方法中,

public void enqueue(final Callback<T> callback) {
        Utils.checkNotNull(callback, "callback == null");
        okhttp3.Call call;
        Throwable failure;
        synchronized(this) {
            if (this.executed) {
                throw new IllegalStateException("Already executed.");
            }

            this.executed = true;
            call = this.rawCall;
            failure = this.creationFailure;
            if (call == null && failure == null) {
                try {
                    call = this.rawCall = this.createRawCall();
                } catch (Throwable var7) {
                    failure = this.creationFailure = var7;
                }
            }
        }

        if (failure != null) {
            callback.onFailure(this, failure);
        } else {
            if (this.canceled) {
                call.cancel();
            }

            call.enqueue(new okhttp3.Callback() {
                public void onResponse(okhttp3.Call call, Response rawResponse) throws IOException {
                    retrofit2.Response response;
                    try {
                        response = OkHttpCall.this.parseResponse(rawResponse);
                    } catch (Throwable var5) {
                        this.callFailure(var5);
                        return;
                    }

                    this.callSuccess(response);
                }

                public void onFailure(okhttp3.Call call, IOException e) {
                    try {
                        callback.onFailure(OkHttpCall.this, e);
                    } catch (Throwable var4) {
                        var4.printStackTrace();
                    }

                }

                private void callFailure(Throwable e) {
                    try {
                        callback.onFailure(OkHttpCall.this, e);
                    } catch (Throwable var3) {
                        var3.printStackTrace();
                    }

                }

                private void callSuccess(retrofit2.Response<T> response) {
                    try {
                        callback.onResponse(OkHttpCall.this, response);
                    } catch (Throwable var3) {
                        var3.printStackTrace();
                    }

                }
            });
        }
    }

注意到这个方法:OkHttpCall.this.parseResponse

retrofit2.Response<T> parseResponse(Response rawResponse) throws IOException {
        ResponseBody rawBody = rawResponse.body();
        rawResponse = rawResponse.newBuilder().body(new OkHttpCall.NoContentResponseBody(rawBody.contentType(), rawBody.contentLength())).build();
        int code = rawResponse.code();
        if (code >= 200 && code < 300) {
            if (code != 204 && code != 205) {
                OkHttpCall.ExceptionCatchingRequestBody catchingBody = new OkHttpCall.ExceptionCatchingRequestBody(rawBody);

                try {
                    T body = this.serviceMethod.toResponse(catchingBody);
                    return retrofit2.Response.success(body, rawResponse);
                } catch (RuntimeException var9) {
                    catchingBody.throwIfCaught();
                    throw var9;
                }
            } else {
                rawBody.close();
                return retrofit2.Response.success((Object)null, rawResponse);
            }
        } else {
            retrofit2.Response var5;
            try {
                ResponseBody bufferedBody = Utils.buffer(rawBody);
                var5 = retrofit2.Response.error(bufferedBody, rawResponse);
            } finally {
                rawBody.close();
            }

            return var5;
        }
    }

T body = this.serviceMethod.toResponse(catchingBody);这个方法返回了解析出来的数据,继续跟:

    R toResponse(ResponseBody body) throws IOException {
        return this.responseConverter.convert(body);
    }

它的实现是通过gson来做的,这个就不细看了,主要看一下返回值,直接是空的,然后,然后提示一个错误,某个字段解析出错,但是这里边直接catch 了,我又检查了该字段,发现是字段类型定义有问题,本来是个long类型的,可是接口返回的是个string类型的,解析异常。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:19:09  更:2022-03-17 22:19:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:03:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码