android - Kotlin android 中的 GSON 序列化,覆盖属性

标签 android kotlin gson retrofit2

我有一个 Retrofit 的默认响应类

open class DefaultResponseImpl : DefaultResponse {

    override val error: List<RestError>? get() = meta?.listErrors

    @Expose
    var meta: Meta? = null
}

这个 Meta 可以有一些额外的字段,所以我想用这样的一些额外字段覆盖它

class SomeResponse : DefaultResponseImpl() {
    @SerializedName("meta")
    @Expose
    val metaLocal: MetaInner? = null

    inner class MetaInner : Meta() {
        @SerializedName("extra_field")
        @Expose
        val field: Long? = null
    }
}

但我收到错误 java.lang.IllegalArgumentException: Unable to create converter for class com.responses.SomeResponse

怎么了? MetaInnerMeta 的子类型,我不会用另一种类型覆盖旧的元字段(这会在 IDE 中出错)。我只是添加了另一个必须从同一个 SerializedName 解析的字段

这在 Kotlin 中如何实现?

最佳答案

我认为这取决于“元”键的冲突。 实际上 SomeResponse 类相当于这个类:

class SomeResponse : DefaultResponse {

   override val error: List<RestError>? get() = meta?.listErrors

   @Expose
   var meta: Meta? = null

   @SerializedName("meta")
   @Expose
   val metaLocal: MetaInner? = null

   inner class MetaInner : Meta() {
     @SerializedName("extra_field")
     @Expose
     val field: Long? = null
   }
}

很容易观察到键 meta 用于变量 metametaLocal

您可以为两个请求使用一个唯一的类,使用泛型来传递 meta 属性的类型。

open class DefaultResponseImpl<T> : DefaultResponse {

override val error: List<RestError>? get() {
    if (meta? is Meta?) return meta?.listErrors
    return null
}

@Expose
var meta: T = null
}

关于android - Kotlin android 中的 GSON 序列化,覆盖属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49158475/

相关文章:

java - Kotlin 解构变量不适用于 Pair、Triple 或数据类

java - Android Studio 3.0 - "Failed to transform file ' gson-2.2.4.jar' 匹配属性 {artifactType=android-classes}”

java - Gson:序列化时如何忽略@SerializeName

java - Firebase 第一次不工作?

android - “setup”已被弃用,不应使用。使用购买配置

android - dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper 无法转换为 android.app.Activity

java - 无法在 Springs Controller 中将 JSON 对象解析为 Java 对象

java - 如何在 android studio 中隐藏我的源代码?

android - 如果 Activity 停止,则通知服务

unit-testing - 如何测试在 Kotlin 中调用顶级函数的代码?