【问题标题】:GSON can`t deserialize Kotlin class with custom getterGSON 无法使用自定义 getter 反序列化 Kotlin 类
【发布时间】:2017-10-24 17:25:58
【问题描述】:

我有课

class Address {
    var address1: String? = null
}

还有简单的json

String jsonString = "{\"address1\":\"test\"}";

所以我只想反序列化它,所以我只写

    Gson gson = new GsonBuilder().create();
    Address address = gson.fromJson(jsonString, Address.class);

而且效果很好。

但如果我添加自定义 getter

class Address {
    var address1: String? = null
        get() = address1 ?: ""
}

我来了

java.lang.StackOverflowError
    at ru.reksoft.okey.models.Address.getAddress1(Address.kt:8)
    at ru.reksoft.okey.models.Address.getAddress1(Address.kt:8)
    //and here are a lot of same lines

那么我该怎么做才能让它正常工作呢?

我看到的一个解决方案是完全删除自定义 getter,但如果我真的需要它们怎么办?

【问题讨论】:

    标签: android gson kotlin


    【解决方案1】:

    您应该改用field

    class Address {
        var address1: String? = null
            get() = field ?: ""
    }
    

    问题是,在自己的 setter 中使用 address1 会导致递归调用序列。相反,field 限定符指的是backing 字段。递归序列导致您遇到的StackOverflowError

    但实际上,您还应该考虑您的属性的意义:它被声明为可空的String,但您不允许null,因为您将它映射到一个空的String"" 真的被接受为地址吗?简单地做val address1: String = ""会好得多。

    【讨论】:

    • *Facepalm*,你说得对,这行得通,谢谢 =) 我犯了这么愚蠢的错误
    • 太棒了。请考虑将属性重构为不可为空的String
    【解决方案2】:

    您正试图在其 getter 方法中访问一个属性。它将依次调用它的 getter 方法等等......这意味着它会递归调用自身,直到出现异常。

    使用field 运算符访问其值

    var address1: String? = null
        get() = field ?: ""
    

    编辑

    如果没有任何意义,为什么要允许可空性? 让 Kotlin 来解决这个问题。做吧

    var address1: String = ""
    

    【讨论】:

      猜你喜欢
      • 2013-09-09
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      相关资源
      最近更新 更多