问题描述
我尝试使用 Kotlin 的默认序列化库解析 JSON。然而,我发现编写一堆数据类来反序列化一个简单的 JSON 字符串真的很困难。
为了说明,
{
"artists": {
"items": [
{
"genres": [
"desi pop","filmi","modern bollywood"
],"images": [
{
"url": "https://i.scdn.co/image/ab6761610000e5ebb2b70762d89a9d76c772b3b6"
}
],"name": "Arijit Singh","type": "artist"
}
]
}
}
为了这些数据,我不得不写这么多类,
@Serializable
data class Root(val artists: Subroot)
@Serializable
data class Subroot(val items: List<Artist>)
@Serializable
data class Artist(
val genres: List<String>,val images: List<Image>,val name: String,val type: String
)
@Serializable
data class Image(val url: String)
有人知道更好的方法吗?一些具有内置魔法的图书馆可以为我做这些事情吗?
解决方法
如果你不想使用自动映射,你可以将它们解析为 JsonElements 并做你自己的事情,而不是让库将它们映射到那些数据类。
https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/json.md#json-elements
例如,如果您想获取该网址,您可以这样做:
val root = Json.parseToJsonElement(json)
return root.
jsonObject["artists"]?.
jsonObject?.get("items")?.
jsonArray?.get(0)?.
jsonObject?.get("images")?.
jsonArray?.get(0)?.
jsonObject?.get("url")?.
jsonPrimitive.toString()
)
如果在遍历树时找不到任何字段,则此特定示例将返回 null。如果任何转换失败,它将给出 IllegalArgumentException。