这个问题在这里已经有了答案:
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
获得配置对象时, query
和 search
值始终为 null
和 init
block 从未被执行。我也试过constructor
并且没有 data
关键字,结果是一样的。
最佳答案
init
仅在调用主构造函数时才执行 block 。但是gson
将 json 解析为对象时不调用主构造函数。
为了解决这个问题,我认为,你应该实现 query
和 search
作为 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/