数据类对象或数组 [英] Data Class Either Object or Array

查看:95
本文介绍了数据类对象或数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Kotlin数据类,它的arg可以是Object或Array.有没有一种方法可以将字符串反序列化到此类中,而不在乎是否不是Array,而是以某种方式将其放入一个由1组成的数组中?

I have a Kotlin data class that has an arg that can either be an Object or Array. Is there a way to de-serialize a string into this class and not care if not an Array but somehow get it into an array of one?

data class Game(var name:List<NameItem>)
data class NameItem(var title: String, var id: Int)

数据可以以单个对象或对象数组的两种方式返回(我无法控制数据,因为它是第三方数据.

data can come back as both ways a single object or an array of objects( I have no control over the data as it is 3rd party data.

jsonString = "{"game":{"name":{"title":"GameName","id":22}}}"
jsonString = "{"game":{"name":[{"title":"GameName","id":22},{"title":"GameName2","id":23}]}}"

game: Game? = Gson().fromJson(jsonString  Game::class.java)

推荐答案

我对解决任务的建议

我的解决方案,如果名称是对象,则将其替换为数组

my solution if name is object, replace it with arrays

data class Game(var name:List<NameItem> )
data class NameItem(var title: String, var id: Int)



fun main(args: Array<String>) {
    var json = "{\"game\":{\"name\":[{\"title\":\"game 1\",\"id\":1},{\"title\":\"game 2\",\"id\":2}]}}"
    println(useJsonParser(json))    //Game(name=[NameItem(title=game 1, id=1), NameItem(title=game 2, id=2)])
    json = "{\"game\":{\"name\":[{\"title\":\"game 1\",\"id\":1}]}}"
    println(useJsonParser(json))    //Game(name=[NameItem(title=game 1, id=1), NameItem(title=game 2, id=2)])
    json = "{\"game\":{\"name\":{\"title\":\"game 1\",\"id\":1}}}" // not array
    println(useJsonParser(json))    //Game(name=[NameItem(title=game 1, id=1)])
}

版本1-创建并注册了适配器链接 @Cililing

version 1 -- created and registry adapter link @Cililing

fun useJsonParser(json: String): Game? {
    val gson = GsonBuilder().registerTypeAdapter(Game::class.java, GameDeserializer()).create()
    return gson.fromJson(json, Game::class.java)
}

class GameDeserializer : JsonDeserializer<Game?> {
    override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): Game? {
        val gameJson = json!!.asJsonObject.get("game")
        if (gameJson.isJsonObject) {
            val jsonName = gameJson.asJsonObject["name"]
            val list = if (jsonName.isJsonObject) {
                arrayOf(Gson().fromJson(jsonName, NameItem::class.java))
            } else {
                val fromJson = Gson().fromJson(jsonName, Array<NameItem>::class.java)
                fromJson
            }.toList()
            return Game(list)
        }
        return null
    }
}

第2版-处理响应

fun useJsonParser(json:String):Game?{
    val jsonObject = JsonParser().parse(json).asJsonObject.get("game")
    if(jsonObject.asJsonObject["name"].isJsonObject){
        val jsonName = jsonObject.asJsonObject["name"].asJsonObject
        val array = JsonArray()
        array.add(jsonName)
        jsonObject.asJsonObject.add("name", array) // rewrite origin JSON
    }

    return Gson().fromJson(jsonObject, Game::class.java)

}

vesrion 3-添加适配器TypeToken>()

vesrion 3 -- add adapter TypeToken>()

fun useJsonParser(json: String): Game? {
    val type = object : TypeToken<MutableList<NameItem>>() {}.type
    val gson = GsonBuilder().registerTypeAdapter(type, NameItemDeserializer()).create()
    return gson.fromJson(JsonParser().parse(json).asJsonObject.get("game"), Game::class.java)
}

class NameItemDeserializer : JsonDeserializer<List<NameItem>?> {
    override fun deserialize(json: JsonElement, type: Type, context: JsonDeserializationContext?): List<NameItem>? {
        with(json){
            return if(isJsonObject){
                arrayListOf(Gson().fromJson(this,NameItem::class.java))
            }else{
                Gson().fromJson(this,Array<NameItem>::class.java).toList()
            }
        }
    }
}

这篇关于数据类对象或数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆