【发布时间】: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