gson 类别Map器:没有布尔类型的设置器/字段

wbgh16ku  于 2022-11-06  发布在  其他
关注(0)|答案(3)|浏览(111)

我使用的是firebase,这是我的数据类定义:

data class ClaimOrder(val address: String? = null,
                  val amount: Long = 0L,
                  val isProcessed: Boolean = false,
                  val onCreate: kotlin.Any? = ServerValue.TIMESTAMP)

但在日志上我看到以下警告:@SerializedName("isProcessed")
我试过@SerializedName("isProcessed"),但没有运气。

j2datikz

j2datikz1#

我找不到Firebase的任何官方文档提到getter和setter的命名规则,但看起来他们正在寻找JavaBean-like getters/setters
当你有一个名为isProcessed的属性时,Firebase要求你有一个名为getIsProcessed()/setIsProcessed()的getter/setter。但是,当该属性在Kotlin中以is开头时,应用了不同的命名规则。根据Kotlin文档,它生成名为isProcessed()/setProcessed()的getter/setter:
如果属性的名称以is开头,则使用不同的名称Map规则:getter的名称将与属性名称相同,而setter的名称将通过将is替换为set来获得。例如,对于属性isOpen,getter将称为isOpen(),setter将称为setOpen()。此规则适用于任何类型的属性,而不仅仅是Boolean

nnt7mjpx

nnt7mjpx2#

我不知道确切的原因,但我猜是这样的:
变量名isProcessed导致生成不同访问器方法,因此基础gsonkotlin方法不匹配
然而,只使用processed似乎可以很好地解决问题。

7vhp5slm

7vhp5slm3#

由于某种原因,即使我在变量名前面省略了is,它仍然无法解析。相反,我通过创建一个自定义构造函数来解决这个问题,如下所示:

data class User(
    var uid: String? = null,
    var isDeveloper: Boolean? = null,
    var email: String? = null
) {
    constructor(dict: Map<String, Any>) : this() {
        this.uid = dict["uid"] as? String
        this.isDeveloper = dict["isDeveloper"] as? Boolean
        this.email = dict["email"] as? String
    }
}

我是这样分析的:

documentSnapshot.data?.let {
    completion(User(it), null)
    return@addOnSuccessListener
}

虽然如果您需要一个大规模的构造函数,这可能不是最好的解决方案,但对于小数据类,它可以很好地工作:)

相关问题