【问题标题】:Gson SerializedName in a Kotlin interfaceKotlin 接口中的 Gson SerializedName
【发布时间】:2019-09-05 00:29:00
【问题描述】:

有没有办法在 Kotlin 接口中使用 gson SerializedName 注解?

interface User {
   @SerializedName("user_id")
   val userId: String?
}

data class MainUser(override val userId: String? = null) : User

我知道注释可以在子类中,但这不是我要寻找的,因为有很多类扩展了该接口。

注 1: 使用抽象类或开放类作为数据类的父类将解决此问题,但新问题将是父类中覆盖的 equals() 方法永远不会被调用(mainUser1 == mainUser2 永远不会检查抽象或开放中的 equls() 方法类用户)

【问题讨论】:

    标签: kotlin serialization interface gson data-class


    【解决方案1】:

    我认为,接口不是拥有属性(或状态)的好地方。接口非常适合建立行为(功能)。我宁愿建议您将抽象类用于您的目的,它会按您的预期工作。

    【讨论】:

    • 同意,但请注意孩子是一个数据类。为 Data 类的父级创建抽象类或开放类的问题是,equals() 方法从未被调用过。(而且接口无论如何都不会保持状态)
    • 我只能说我不同意。接口中的属性只是类需要实现的方法,没有充分的理由在它们之后需要()。参见例如kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/…;将其设为fun 而不是val,您会赢得什么?
    • 在这里使用接口作为父级并不理想,但不幸的是,这是我迄今为止发现的唯一可以处理 equals() 的方法。看看这个线程discuss.kotlinlang.org/t/…
    【解决方案2】:

    您可以像这样使用@get use-site target 注释属性getter:

    interface User {
        @get:SerializedName("user_id")
        val userId: String?
    }
    
    data class MainUser(override val userId: String? = null) : User
    

    【讨论】:

    • Gson 不会这样解析
    猜你喜欢
    • 2016-04-17
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多