当在 kotlin 中从 GSON 生成对象时,数据 class 未调用 init 函数

Data class init function is not called when object generated from GSON in kotlin

我正在使用 Gsson 转换 JSON to Kotlin data class。在创建数据 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")
    }
}

当我从 Gson 获得配置对象时,querysearch 值始终是 null 并且 init 块从未执行过。我也尝试了 constructor 并且没有 data 关键字,结果是一样的。

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

为了解决这个问题,我认为,您应该将 querysearch 实现为 get 方法或使用 lazy init。像这样:

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")
    }
}

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