当在 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
获得配置对象时,query
和 search
值始终是 null
并且 init
块从未执行过。我也尝试了 constructor
并且没有 data
关键字,结果是一样的。
init
块仅在调用主构造函数时执行。但是 gson
在将 json 解析为对象时不会调用主构造函数。
为了解决这个问题,我认为,您应该将 query
和 search
实现为 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")
}
}
或最适合您要求的任何其他方法。
我正在使用 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
获得配置对象时,query
和 search
值始终是 null
并且 init
块从未执行过。我也尝试了 constructor
并且没有 data
关键字,结果是一样的。
init
块仅在调用主构造函数时执行。但是 gson
在将 json 解析为对象时不会调用主构造函数。
为了解决这个问题,我认为,您应该将 query
和 search
实现为 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")
}
}
或最适合您要求的任何其他方法。