使用 Gson 将嵌套可变映射反序列化为 Kotlin
Deserialize nested mutable map from with Gson to Kotlin
由于 MutableMap 对象,我无法使用 Gson 将 JSON 转换为 Kotlin 数据 class。数据class
data class MyAction(
@Key("action") var action: String = "default",
@Key("data") var data: MutableMap<String, Any> = mutableMapOf()
)
data
映射中的值是几个 types.I 尝试使用 TypeToken 和泛型的值,如在 中一样,但没有用。收到的例子 json:
{"action":"playVideo","data":{"media":{"id":15060328,"url" :"http://url_to_get_item","name":"item name","shortDescription":"short desc"}
{"action":"setSpeed","data":{"value":1}}
{"action":"getProperty","data":{"value":"position"}}
以这种方式设计数据不是一个好的做法,但如果您无法控制后端,这里有一个如何反序列化的示例
class MyDeserializer : JsonDeserializer<MyAction>{
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): MyAction {
val myAction = MyAction()
val action = json.asJsonObject.get("action")
val data = json.asJsonObject.get("data")
myAction.action = context.deserialize<String>(action, String::class.java)
val myMap = mutableMapOf<String, Any>()
data.asJsonObject.keySet().forEach {
when (it) {
is String -> { myMap[it] = context.deserialize(data.asJsonObject.get(it), String::class.java) }
is MyCustomObject1 -> { myMap[it] = context.deserialize(data.asJsonObject.get(it), MyCustomObject1::class.java) }
is MyCustomObject2 -> { myMap[it] = context.deserialize(data.asJsonObject.get(it), MyCustomObject2::class.java) }
else -> myMap[it] = context.deserialize(data.asJsonObject.get(it), Any::class.java)
}
}
myAction.data = myMap
return myAction
}
}
别忘了注册你的解串器
fun getSmartGson() = GsonBuilder().registerTypeAdapter(MyAction::class.java, MyDeserializer())
由于 MutableMap 对象,我无法使用 Gson 将 JSON 转换为 Kotlin 数据 class。数据class
data class MyAction(
@Key("action") var action: String = "default",
@Key("data") var data: MutableMap<String, Any> = mutableMapOf()
)
data
映射中的值是几个 types.I 尝试使用 TypeToken 和泛型的值,如在
{"action":"playVideo","data":{"media":{"id":15060328,"url" :"http://url_to_get_item","name":"item name","shortDescription":"short desc"}
{"action":"setSpeed","data":{"value":1}}
{"action":"getProperty","data":{"value":"position"}}
以这种方式设计数据不是一个好的做法,但如果您无法控制后端,这里有一个如何反序列化的示例
class MyDeserializer : JsonDeserializer<MyAction>{
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): MyAction {
val myAction = MyAction()
val action = json.asJsonObject.get("action")
val data = json.asJsonObject.get("data")
myAction.action = context.deserialize<String>(action, String::class.java)
val myMap = mutableMapOf<String, Any>()
data.asJsonObject.keySet().forEach {
when (it) {
is String -> { myMap[it] = context.deserialize(data.asJsonObject.get(it), String::class.java) }
is MyCustomObject1 -> { myMap[it] = context.deserialize(data.asJsonObject.get(it), MyCustomObject1::class.java) }
is MyCustomObject2 -> { myMap[it] = context.deserialize(data.asJsonObject.get(it), MyCustomObject2::class.java) }
else -> myMap[it] = context.deserialize(data.asJsonObject.get(it), Any::class.java)
}
}
myAction.data = myMap
return myAction
}
}
别忘了注册你的解串器
fun getSmartGson() = GsonBuilder().registerTypeAdapter(MyAction::class.java, MyDeserializer())