【问题标题】:Deserialize nested mutable map from with Gson to Kotlin将嵌套的可变映射从 Gson 反序列化到 Kotlin
【发布时间】:2019-09-27 11:39:37
【问题描述】:

由于 MutableMap 对象,我无法使用 Gson 将 JSON 转换为 Kotlin 数据类。数据类

data class MyAction(
    @Key("action") var action: String = "default",
    @Key("data") var data: MutableMap<String, Any> = mutableMapOf()
)

data 映射中的值有几种类型。我尝试过使用 TypeToken 和泛型,就像在 here 中一样,但没有奏效。接收到的json示例:

  1. {"action":"playVideo","data":{"media":{"id":15060328,"url":"http://url_to_get_item","name":"item name", "shortDescription":"简短描述"}

  2. {"action":"setSpeed","data":{"value":1}}

  3. {"action":"getProperty","data":{"value":"position"}}

【问题讨论】:

  • 添加一个您尝试反序列化的 JSON 示例

标签: android json kotlin gson data-class


【解决方案1】:

以这种方式设计数据不是一个好习惯,但如果您无法控制后端,这里有一个如何反序列化的示例

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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多