gson Retrofit -如果字段的数据类型不同,如何忽略字段?

jckbn6z7  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(222)

我使用的是带有GsonConverterFactory和RxJavaFactory的改型2.4.0。
假设我现在调用一个名为getSomething的API。
在正常情况下,服务器返回

{
    status: "ok",
    errorMsg: "",
    data: {...}
}

但如果发生错误:

{
    status: "error",
    errorMsg: "Some error message",
    data: []
}

请注意,如果发生错误,数据会变成数组。
下面是我对API的定义:

@GET("URL")
fun getSomething(): Observable<SomeResponse<SomeObject>>

一些响应:

open class SomeResponse<T> {

    var data: T? = null

    @SerializedName("errorMsg")
    var errorMessage: String? = ""

    var status: String? = ""
}

而在APIManager(单例)中:

fun getSomething(): Observable<SomeObject> {
    return someAPI.getSomething()
            .map{ response ->
                if (response.status != "ok") throw new APIException(response.errorMessage)
                response.data
            }
            .subscribeOn(Schedulers.io())
            .unsubscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
}

正如您所看到的,如果status不是"ok",则会抛出我自己定义的APIException,并从服务器返回错误消息,以便我可以进行自己的处理(例如,显示带有该错误消息的对话框)。
但现在它连那一抛都够不着。
由于data现在是一个数组,因此会抛出一个JsonSyntaxException,因此我无法向用户显示正确的错误消息。

我想做的事

我知道我可以在检查状态后延迟data的解析,方法是使Retrofit接口的所有声明返回Observable<SomeResponse<Any>>,并执行以下操作:

.map{ response ->
                if (response.status != "ok") throw new APIException(response.errorMessage)
                response.data
            }
            .map{ data ->
                //Parse the object here
            }

假设我不想这样做,仍然依赖于GsonConverterFactory来进行解析,有没有办法抛出APIException并显示正确的错误消息?

58wvjzkj

58wvjzkj1#

对于这种情况,您必须手动解析响应,正如Adeel建议的那样,将“data”作为JsonElement
当你得到{status: "error"},即异常情况,你可以显示错误消息,否则,在{status: "ok"}的情况下,你可以从'data'获得JsonArray并使用该数组。

nhhxz33t

nhhxz33t2#

作为一种替代方案,
如果您使用的是Kotlin,则可以绕过此问题,将变量声明为“Any”。

@SerializedName("my_parameter")
@Expose
var myVar: Any ?= null

相关问题