【问题标题】:Parse JSON without data class in Kotlin?在 Kotlin 中解析没有数据类的 JSON?
【发布时间】:2022-01-31 20:39:45
【问题描述】:

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
)

这很重,对我的用例没有用处。

这样的图书馆存在吗?谢谢!

【问题讨论】:

  • 请查看this answer。我相信它适用于您的用例。
  • 我猜您指的是 Klaxon 的答案。它似乎完全符合我的要求,但 Klaxon 的解析器已被弃用。
  • 在杰克逊你有org.bson.Document,它就像一张地图。你可以用它做.get 和其他事情。我确信所有其他人都有类似的对象。
  • 您列出的大多数(如果不是全部)JSON 解析器也有通用的解析方法,无需定义类

标签: json kotlin


【解决方案1】:

使用kotlinx.serialization,您可以parse JSON String into a 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

    【讨论】:

      猜你喜欢
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      相关资源
      最近更新 更多