使用 Kotlin 的序列化库编写一堆数据类来解析一个简单的 JSON 真的很乏味有什么更好的办法吗?

问题描述

我尝试使用 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。