kotlin - 在 kotlin 中从 GSON 生成对象时不调用数据类初始化函数

标签 kotlin data-class

这个问题在这里已经有了答案:





Why Kotlin data classes can have nulls in non-nullable fields with Gson?

(2 个回答)


3年前关闭。




我正在使用 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")
    }
}

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

最佳答案

init仅在调用主构造函数时才执行 block 。但是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")
    }
}

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

关于kotlin - 在 kotlin 中从 GSON 生成对象时不调用数据类初始化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54767493/

相关文章:

java - Kotlin编译器在编译Kotlin代码时如何处理Java代码?

java - 如何通过 Java/Kotlin API 从 KeyCloak 请求 JWT token

unit-testing - 如何在 Kotlin 上测试数据类?

android - 在 Kotlin Android 的 API 响应模型中调用辅助构造函数

android - 放置API自动填充问题

java - 将 Kotlin 文件转换为 java,向其添加 java 代码并转换回 Kotlin 是否与直接将代码添加到 Kotlin 文件相同?

lambda - 使用 lambda 简化 Kotlin 函数

generics - 使用 Kotlin 在通用接口(interface)中嵌套数据类

Json 到 Kotlin 数据类

int - Kotlin 数据类 Gson 序列化问题