首页 > 解决方案 > 数据类对象或数组

问题描述

我有一个 Kotlin 数据类,它的 arg 可以是对象或数组。有没有办法将一个字符串反序列化到这个类中,而不关心是否不是一个数组,而是以某种方式把它变成一个数组?

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

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

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)

标签: arraysjsonkotlingson

解决方案


你必须编写一个自定义的JsonDeserializer. 两者或您的班级应该具有相同的父班级。JsonDeserializer然后,为此特定类型编写自定义。

例如:

sealed class GameParent() {
    data class Game(val name: String): GameParent()
    data class GameList(val games: List<Game>): GameParent()
}

class GameDeserializer : JsonDeserializer<GameParent> {
    override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): GameParent {
        with(json) {
           if(isJsonObject) {
             // parse as Game
           }

           if(isJsonArray) {
             // parse as GameList
           }
        }
    }
}

然后,在你的GsonBuilder你必须注册这个自定义JsonDeserializergsonBuilder.registerTypeAdapter(GameParent::class.java, GameDeserializer());

现在,只要您Gson期望GameParent使用已注册的反序列化器。


推荐阅读