【问题标题】:Add extra attribute to POJO in Kotlin在 Kotlin 中为 POJO 添加额外的属性
【发布时间】:2019-04-18 15:24:39
【问题描述】:

我通过 Retrofit 从 API 调用中获得以下模型:

data class User(
    @Expose val id: Int
    @Expose var username: String,
    @Expose var phoneNum: String?,
    @Expose var email: String?,
    @Expose var payments: List<PaymentMethod>
)

出于与this SO 答案相关的原因,我需要添加一个额外的属性。

额外的参数将是一个数据类 PaymentsMethods:

data class PaymentsMethods(
    val paymentMethods: List<PaymentMethod>
)

如何在创建 User 类时添加属性值?

这是我目前尝试过的:

// add an attribute (with a default value) that won't be filled by the parser.
data class User(
    @Expose val id: Int
    @Expose var username: String,
    @Expose var phoneNum: String?,
    @Expose var email: String?,
    @Expose var payments: List<PaymentMethod>,
    @Expose var paymentsObject: PaymentMethods = PaymentMethods(payments)
)

// create variable and set the value on init
data class User(
    @Expose val id: Int
    @Expose var username: String,
    @Expose var phoneNum: String?,
    @Expose var email: String?,
    @Expose var payments: List<PaymentMethod>
){
init {
    var paymentsObject: PaymentMethods = PaymentMethods(payments)
    }
 }

它们都不起作用。任何建议将不胜感激。

【问题讨论】:

  • 我想提供帮助,但我无法阅读您的代码。您不应该使用带有json键的@SerializedName作为值吗? @Expose 仅在您使用 GsonBuilder#excludeFieldsWithoutExposeAnnotation 时才有意义,而我看不到您在使用它。此外,具有复数名称的类没有意义。如果你使用 Room,那么你可以创建一个 TypeConverter 来从 Retrofit 中检索一个列表并直接存储它。
  • 你能举一个具体的例子来说明你的 json 结果是什么样的吗? (文本格式,所以不是 POJO)
  • @ZUNJAE @SerializedName 仅在 JSON 属性名称与 POJO 属性名称不同时才需要,对于这种情况,我认为我们可以忽略 @Expose 注释。
  • @ZUNJAE 关于 JSON,不需要添加。本题即将在数据类中创建一个额外的属性。
  • 根据您编译应用程序的方式(调试、发布、proguard、dexguard 等),这些变量名称将被更改,因此 SerializedName 非常重要。

标签: kotlin retrofit pojo data-class


【解决方案1】:

我希望这是你需要的:

data class User(
    @Expose val id: Int,
    @Expose var username: String,
    @Expose var phoneNum: String?,
    @Expose var email: String?
) {
    @Expose var payments: List<PaymentMethod> by Delegates.observable(listOf()) { 
        prop, oldValue, newValue ->
        paymentsObject = PaymentMethods(newValue)
    }
    lateinit var paymentsObject: PaymentMethods
}

【讨论】:

  • 感谢您的回答。不幸的是,它也不起作用。显然,Retrofit 不遵循通用对象初始化(而是使用反射),因此无法以编程方式添加额外的属性。
猜你喜欢
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
相关资源
最近更新 更多