从Kotlin中的GSON生成对象时,不调用数据类初始化函数

时间:2019-02-19 13:32:00

标签: kotlin data-class

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

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获得Configuration对象时,querysearch的值始终为null,并且从未执行过init块。我还尝试了constructor,但没有data关键字,结果是相同的。

1 个答案:

答案 0 :(得分:2)

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

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