【问题标题】:Data class init function is not called when object generated from GSON in kotlin [duplicate]在kotlin中从GSON生成对象时不调用数据类初始化函数[重复]
【发布时间】:2019-07-13 00:43:42
【问题描述】:

我正在使用Gsson 转换JSON to Kotlin data class。在创建数据类对象时,我想解析 init 方法中的值。但是init 从未调用过,并且生成的对象的值为空。

data class Configuration (val groupId:Int, val key:String, val source:String){
    val query:String
    val search:String
    init {
        val obj = JSONObject(key)
        query = obj.getString("q")
        search = obj.getString("search")
    }
}

当我从Gsonquerysearch 获得配置对象时,值始终为nullinit 块从未执行过。我也试过constructor,没有data关键字,结果是一样的。

【问题讨论】:

  • 您确定在初始化期间您的 JSONObject 中有“q”和“search”元素吗?
  • 可能是 GSON 在反序列化时覆盖了这些字段。 github.com/google/gson/blob/master/…
  • @laughter 是的,关键字段包含一个 json 对象

标签: kotlin data-class


【解决方案1】:

init 块仅在调用主构造函数时执行。但是gson在将json解析为对象时并没有调用主构造函数。

我认为,要解决这个问题,您应该将querysearch 实现为get 方法或使用惰性初始化。像这样的:

data class Configuration(val groupId: Int, val key: String, val source: String) {
    var query: String = ""
        get() {
            if (field == null) {
                initInternal()
            }
            return field
        }
        private set

    var search: String? = null
        get() {
            if (field == null) {
                initInternal()
            }
            return field
        }
        private set

    private fun initInternal() {
        val obj = JSONObject(key)
        query = obj.getString("q")
        search = obj.getString("search")
    }
}

或任何其他最适合您要求的方法。

【讨论】:

  • 谢谢,你的方法行得通,只需要添加filed != null 检查。请更新答案,我将其标记为正确答案。
  • @shantanu,没有必要添加一个 not null 检查,因为这个变量不是 nullable :)
  • 但是 filed.isEmptry() 得到的是空指针,因为最初查询或搜索是空的(null)
  • @shantanu,我明白了,编辑了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 2023-03-08
  • 2021-11-06
相关资源
最近更新 更多