在 kotlin 中从 GSON 生成对象时不会调用数据类 init 函数

sha*_*anu 9 kotlin data-class

我正在使用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")
    }
}
Run Code Online (Sandbox Code Playgroud)

当我配置的从对象Gsonquerysearch值始终nullinit永远不会执行块。我也试过 constructor 没有data关键字,结果是一样的。

Dem*_*god 10

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

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