【问题标题】:How to use generic types with retrofit and moshi in kotlin?如何在 kotlin 中使用带有改造和 moshi 的泛型类型?
【发布时间】:2020-10-18 08:39:39
【问题描述】:

假设我们有以下模型

open class Orden(@field:Json(name = "vehiculo_id") var vehiculo_id: IdNameItem = IdNameItem()) :
RealmObject()

open class IdNameItem(
@field:Json(name = "id") var id: Long = 0,
@field:Json(name = "name") var name: String = ""

) : RealmObject()

那个,我们想从 WS 获取所有的 Orden,像这样

 @GET("orden")
fun getOrden(@Body body: Any = Object()): Call<SyncResponse>

我们已经这样配置改造

val retrofit = Retrofit.Builder()
        .baseUrl(environment.url)
        .addConverterFactory(MoshiConverterFactory.create())
        .client(httpClient.build())
        .build()
    return retrofit.create(WebServices::class.java)

而SyncReponse是这样配置的

class SyncResponse : BaseResponse<List<Orden>>()

open class BaseResponse<T> {

@field:Json(name = "result")
lateinit var result: ResultResponse<T>

@field:Json(name = "error")
val error: ErrorResponse = ErrorResponse()

结果响应看起来像..

open class ResultResponse<T>(
@field:Json(name = "status") val status: Int = 0,
@field:Json(name = "msj_error") val msj_error: String = "",
@field:Json(name = "data")  var data: T

这就是我假装解析此响应的方式

{
    "result": {
         "status": 201,
         "msj_error": "",
         "data": [
             {"user_id": 1,
              "vehiculo": "New Holland/7630/1235888",
                ** others fields **
             }]
         }
}

当我运行它时,它会抛出这个错误

06-27 20:12:27.895 1036-1036/com.azanini.ordenes E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.azanini.ordenes, PID: 1036
java.lang.IllegalArgumentException: Unable to create converter for class com.azanini.ordenes.ws.NoResponse
    for method WebServices.login
    at retrofit2.Utils.methodError(Utils.java:53)
    at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:115)
    at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:82)
    at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:37)
    at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:192)
    at retrofit2.Retrofit$1.invoke(Retrofit.java:149)
    at java.lang.reflect.Proxy.invoke(Proxy.java:393)
    at $Proxy0.login(Unknown Source)
    at com.azanini.ordenes.activities.LoginActivity.login(LoginActivity.kt:83)
    at com.azanini.ordenes.activities.LoginActivity.onClick(LoginActivity.kt:76)
    at android.view.View.performClick(View.java:5716)
    at android.widget.TextView.performClick(TextView.java:10926)
    at android.view.View$PerformClick.run(View.java:22596)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:7325)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
 Caused by: java.lang.IllegalArgumentException: No JsonAdapter for ? extends com.azanini.ordenes.model.Orden (with no annotations)
for ? extends com.azanini.ordenes.model.Orden
for java.util.List<? extends com.azanini.ordenes.model.Orden> data
for class com.azanini.ordenes.ws.ResultResponse result
for class com.azanini.ordenes.ws.NoResponse
    at com.squareup.moshi.Moshi$LookupChain.exceptionWithLookupStack(Moshi.java:348)
    at com.squareup.moshi.Moshi.adapter(Moshi.java:149)
    at com.squareup.moshi.Moshi.adapter(Moshi.java:97)
    at com.squareup.moshi.Moshi.adapter(Moshi.java:67)
    at com.squareup.moshi.CollectionJsonAdapter.newArrayListAdapter(CollectionJsonAdapter.java:52)
    at com.squareup.moshi.CollectionJsonAdapter$1.create(CollectionJsonAdapter.java:36)
    at com.squareup.moshi.Moshi.adapter(Moshi.java:137)
    at com.squareup.moshi.ClassJsonAdapter$1.createFieldBindings(ClassJsonAdapter.java:99)
    at com.squareup.moshi.ClassJsonAdapter$1.create(ClassJsonAdapter.java:82)
    at com.squareup.moshi.Moshi.adapter(Moshi.java:137)
    at com.squareup.moshi.ClassJsonAdapter$1.createFieldBindings(ClassJsonAdapter.java:99)
    at com.squareup.moshi.ClassJsonAdapter$1.create(ClassJsonAdapter.java:82)
    at com.squareup.moshi.Moshi.adapter(Moshi.java:137)
    at com.squareup.moshi.Moshi.adapter(Moshi.java:97)
    at retrofit2.converter.moshi.MoshiConverterFactory.responseBodyConverter(MoshiConverterFactory.java:91)
    at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:352)
    at retrofit2.Retrofit.responseBodyConverter(Retrofit.java:335)
    at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:113)
        ... 18 more
 Caused by: java.lang.IllegalArgumentException: No JsonAdapter for ? extends com.azanini.ordenes.model.Orden (with no annotations)
    at com.squareup.moshi.Moshi.adapter(Moshi.java:147)
        ... 34 more

我想你可以想出在“数据”字段中可以设置任何类型的数据,所以我想参数化它,有可能吗?

【问题讨论】:

    标签: android json kotlin retrofit moshi


    【解决方案1】:
    猜你喜欢
    • 1970-01-01
    • 2017-04-18
    • 2018-08-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多