Rxjava+Retrofit 网络请求中,封装解决数据格式异常

本文介绍如何解决RxJava结合Retrofit进行网络请求时出现的数据转换异常问题,特别是当后台返回的数据结构与预期不符时的处理方法。通过自定义GsonConverterFactory,实现了对异常数据的优雅处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Rxjava+Retrofit的强大以及优点我就我多说了,本篇文章主要是解决一下在使用过程中遇到的一个常见的bug,数据转换异常

场景:在请求后台数据的时候,经常会有,因为异常情况,导致后台Success,然后返回一个错误码和错误信息,
而返回的主体数据结构就可能会是千奇百怪了,经常和预设的结构不符合,这时,就会出现数据结构异常的报错。
处理起来很麻烦,无法将其中的真正的错误原因展现给用户。本章主要解决这类问题

我先将报错给大家发一下

03-29 16:36:14.624  8589  8589 W System.err: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 83 path $.result.data
03-29 16:36:14.625  8589  8589 W System.err: 	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
03-29 16:36:14.625  8589  8589 W System.err: 	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
03-29 16:36:14.625  8589  8589 W System.err: 	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
03-29 16:36:14.615  8804  8804 W netd    : type=1400 audit(0.0:37704): avc: denied { search } for name="com.zte.heartyservice" dev="mmcblk0p30" ino=1095623 scontext=u:r:netd:s0 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0
03-29 16:36:14.625  8589  8589 W System.err: 	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
03-29 16:36:14.626  8589  8589 W System.err: 	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
03-29 16:36:14.626  8589  8589 W System.err: 	at com.google.gson.Gson.fromJson(Gson.java:887)
03-29 16:36:14.627  8589  8589 W System.err: 	at com.google.gson.Gson.fromJson(Gson.java:852)
03-29 16:36:14.628  8589  8589 W System.err: 	at com.google.gson.Gson.fromJson(Gson.java:801)
03-29 16:36:14.628  8589  8589 W System.err: 	at com.weinong.business.api.func.CustomResponseBodyConverter.convert(CustomResponseBodyConverter.java:38)
03-29 16:36:14.628  8589  8589 W System.err: 	at com.weinong.business.api.func.CustomResponseBodyConverter.convert(CustomResponseBodyConverter.java:21)
03-29 16:36:14.628  8589  8589 W System.err: 	at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:119)
03-29 16:36:14.628  8589  8589 W System.err: 	at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:218)
03-29 16:36:14.628  8589  8589 W System.err: 	at retrofit2.OkHttpCall.execute(OkHttpCall.java:180)
03-29 16:36:14.628  8589  8589 W System.err: 	at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:41)
03-29 16:36:14.628  8589  8589 W System.err: 	at io.reactivex.Observable.subscribe(Observable.java:10903)
03-29 16:36:14.628  8589  8589 W System.err: 	at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
03-29 16:36:14.629  8589  8589 W System.err: 	at io.reactivex.Observable.subscribe(Observable.java:10903)
03-29 16:36:14.629  8589  8589 W System.err: 	at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)
03-29 16:36:14.629  8589  8589 W System.err: 	at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)
03-29 16:36:14.629  8589  8589 W System.err: 	at io.reactivex.internal.operators.observable.ObservableMap$MapObserver.onNext(ObservableMap.java:64)
03-29 16:36:14.629  8589  8589 W System.err: 	at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onNext(ObservableSubscribeOn.java:58)
03-29 16:36:14.629  8589  8589 W System.err: 	at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)
03-29 16:36:14.629  8589  8589 W System.err: 	at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)
03-29 16:36:14.630  858
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值