arrays - 数据类对象或数组
问题描述
我有一个 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)
解决方案
你必须编写一个自定义的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
你必须注册这个自定义JsonDeserializer
:
gsonBuilder.registerTypeAdapter(GameParent::class.java, GameDeserializer());
现在,只要您Gson
期望GameParent
使用已注册的反序列化器。
推荐阅读
- python - 在一个数据框中绘制 Python 中的多行(每个类别一行)
- javascript - 当我输入四位数字时,会添加“/”,但是当我模糊时,“/”会消失
- wordpress - 从网站中提取价格的 XPath 表达式
- python - 如何在熊猫数据框中进行复杂计算
- java - java.lang.ClassNotFoundException:升级库后的 java.lang.constant.Constable
- primefaces - Primefaces时间线排序同一日期的事件
- laravel - 为什么我在 yahoo.com 帐户上收不到 laravel 发送的电子邮件?
- android - APIGEE API 的“缺少必填字段”响应
- android - 带有 DigitsKeyListener 和 inputType 的 keyListener 不能以编程方式协同工作
- python - 如何分隔逗号分隔的字符串点