Не рекомендуется создавать данные таким образом, но если у вас нет контроля над бэкэндом, вот пример, как десериализовать это
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())