【问题标题】:@SerializedName val can not be initialized in constructor@SerializedName val 无法在构造函数中初始化
【发布时间】:2021-10-19 15:03:41
【问题描述】:

这里我有一个使用 Retrofit2 的 POST 请求返回一个 json 字符串,其中有一个名为“messageCode”的字段

还有一个 BaseResponse 类,它用@SerializedName("code") 定义了一个“val 代码”,它是只读的。

open class BaseResponse(@SerializedName(value = "mc", alternate = ["code"]) val code: Int)

所以我写了一个扩展 BaseResponse 的类,然后将“messageCode”交给 super 中的“code”,如下所示:

class MyConcreteResponse( 
    messageCode: Int?, 
    val data: List<String>?
) :BaseResponse(code = messageCode)

但事实证明,当我访问“code”时,它只是0,不等于“messageCode”

我需要加载“代码”,因为另一个只读类访问它,那么如何获取该“消息代码”并将其提供给 super 中的“代码”?

【问题讨论】:

  • 您是否检查过“messageCode”在您收到响应时具有该值
  • 是的,当我在 MyConcreteResponse 中的“messageCode”之前添加“val”时,我可以访问它并打印正确的值。

标签: android kotlin


【解决方案1】:

我假设您正在使用 gson 库。 gson 不使用构造函数来初始化数据类和变量,它使用 java 反射。所以你必须编写一个实现 JsonDeserializer 的自定义类,并编写自己的反序列化器来解析值并将其传递给父类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2017-07-19
    • 2020-12-27
    相关资源
    最近更新 更多