改造 - 如果字段的数据类型不同,我如何忽略该字段?

时间:2018-06-12 09:36:56

标签: android kotlin retrofit retrofit2 gson

我正在使用Retrofit 2.4.0,使用GsonConverterFactory和RxJavaFactory。

假设我现在正在调用名为getSomething的API。

在正常情况下,服务器返回

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

但是如果发生错误:

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

请注意,如果发生错误,数据将成为数组。

这是我定义API的方式:

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

SomeResponse:

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())
}

正如您所看到的,如果状态不是"ok",我自己定义的APIException将被抛出服务器返回的错误消息,以便我可以自己处理(例如显示带有该错误消息的对话框。)

但现在它甚至无法达到那个目标 由于data现在是一个数组,因此会引发JsonSyntaxException,因此我无法向用户显示正确的错误消息。

我想做什么

我知道在检查状态后,通过将Retrofit接口的所有声明都返回data,我可以延迟解析Observable<SomeResponse<Any>>,并执行:

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

假设我不想这样做,依靠GsonConverterFactory进行解析,有没有办法抛出APIException正确的错误信息?

2 个答案:

答案 0 :(得分:0)

对于这种情况,您必须手动解析响应,正如Adeel建议的那样,采取数据&#39;为JsonElement

当您获得{database即例外情况时,您可以显示错误消息,否则如果是{status: "error"},您可以从数据&#39;中获取JsonArray。并使用该数组。

答案 1 :(得分:0)

作为替代,

如果您使用的是 Kotlin,则可以绕过此问题,将变量声明为“Any”。

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