【问题标题】:Cannot Deserialize Generic Type T Moshi无法反序列化通用 T 型 Moshi
【发布时间】:2020-03-26 09:47:43
【问题描述】:

对不起,如果这是一个基本问题,但我是 Moshi 的新手。

所以,我有一个具有通用类型参数的类,如下所示:

class BaseResponse<T> {
   @Json(name = "message")
   var message: String? = null
   @Json(name = "data")
   var data: T? = null
   @Json(name = "meta")
   var meta: JsonObject? = null
   @Json(name = "error")
   var error: ErrorResponse? = null
}

在 GSON 中,这是自动完成的,只要我提供 @SerializedName("data") 并在我的改造方法中扩展 BaseResponse,它就可以工作。但由于我无法反序列化 BaseResponse,它返回了 moshi 错误。我该如何解决这个问题?

【问题讨论】:

  • 您需要创建 moshi 适配器来为您进行转换。
  • 感谢您的回复,我该如何创建这个适配器?我需要为每个班级创建适配器吗?

标签: android kotlin gson moshi


【解决方案1】:

代码中替换泛型类型的基类和类都必须用@JsonClass(generateAdapter = true)注解。请注意,为了将 json 正确转换为这样的模型类,最重要的是将基类中的字段声明为 var 并且 NOT 为 val。请看下面的例子:

 @JsonClass(generateAdapter = true)
 class BaseResponse<T> {

   @Json(name = "message")
   var message: String? = null
   @Json(name = "data")
   var data: T? = null
   @Json(name = "meta")
   var meta: JsonObject? = null
   @Json(name = "error")
   var error: ErrorResponse? = null
}

API 示例:

@GET("api/info")
suspend fun getInfo(): BaseResponse<Info>

信息:

@JsonClass(generateAdapter = true)
data class Info(
    val language: String? = null,
    val profile: Profile? = null
)

【讨论】:

  • 感谢您的解决方案,我在 BaseResponse 类中使用了 val。现在我正在使用 var,它工作正常。
  • 您节省了一天...感谢您发布答案
【解决方案2】:

在 Moshi 中,您必须将注释显式声明为字段注释,例如 @field:Json(name = "message")

【讨论】:

  • 感谢您的回复,@field:Json(name = "data") 与 @Json(name = "data") 有什么不同吗?
  • 是的,在某种程度上。 @field:Json = @Json@Json != @field:Json。见kotlinlang.org/docs/reference/…(注解使用站点目标)如果解决了你的问题,请不要忘记接受答案
猜你喜欢
  • 2020-02-27
  • 2020-02-28
  • 2017-04-18
  • 2016-09-16
  • 2021-12-22
  • 2021-04-09
  • 2019-03-05
  • 2019-04-03
  • 1970-01-01
相关资源
最近更新 更多