在 Kotlin 中如何解析 JSON,不使用数据类?

10

在 Kotlin 中有许多 JSON 解析器,例如 Forge、Gson、JSON、Jackson 等等。但它们将 JSON 反序列化为数据类,这意味着需要定义一个数据类,其中包含与 JSON 对应的属性,并且对于每个具有不同结构的 JSON 都需要进行定义。

但是,如果您不想为每个要解析的 JSON 定义一个数据类呢?

我希望有一种解析器不使用数据类,例如可以像以下方式实现:

val jsonstring = '{"a": "b", "c": {"d: "e"}}'

parse(jsonstring).get("c").get("d") // -> "e"

只是一些不需要我编写类似以下代码的数据类的东西:

data class DataClass (
    val a: String,
    val b: AnotherDataClass
)

data class AnotherDataClass (
    val d: String
)

在我的使用场景下,这非常臃肿且无用。

是否存在这样的库?谢谢!


请查看这个答案,我相信它适用于您的使用情况。 - Bruno Gava Guerra
我猜你指的是Klaxon的答案。它似乎正好符合我的要求,但是Klaxon的解析器已经过时了。 - Kureteiyu
在Jackson中,您有 org.bson.Document,它类似于映射。您可以使用 .get 和其他方法。我相信所有其他对象都有类似的功能。 - AlexT
大多数,如果不是全部,您列出的 JSON 解析器都有通用的解析方法,而无需定义类。 - Ivo
2个回答

9
通过 kotlinx.serialization,您可以将 JSON 字符串解析成 JsonElement(参见此处)
val json: Map<String, JsonElement> = Json.parseToJsonElement(jsonstring).jsonObject

2
你可以使用JsonPath
val json = """{"a": "b", "c": {"d": "e"}}"""
val context = JsonPath.parse(json)
val str = context.read<String>("c.d")
println(str)

输出:

结果:e


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接