当预先不知道架构时,如何遍历 json?

How do you iterate over json when the schema is not known up front?

我一直在阅读 Play 的文档 here 关于 json 解析,但它似乎都是为解析而量身定制的 Json 你提前知道结构(例如它很好地映射到现有模型)。对我来说,这进一步反映在 json 模块的 api 或多或少是 ///,它们按名称查找结构.

虽然最终我 am 试图转换为模型,但这是一个 public API 点,所以我希望一路友好并收集任何错误。即,不正确的字段。

在伪代码中,id 喜欢能够做这样的事情:

allowed_values = ['name', 'age', 'job'] 
field_errors = []
for key, value in json: 
    if key not in allowed_values: 
        field_erros.append(key) 

这让我可以 return 类似 unrecognized field "naem" 的东西,我认为我很方便。

这可以(轻松地)在 Scala 中完成吗

是的,这是可能的,尽管您将不得不编写一些自定义代码,所以我不会真的考虑它 "easy"。

Play 将 JSON 解析为 JsValue 特征。您可以对该特征进行模式匹配,它有 2 个您感兴趣的子类型:JsObjectJsArray(还有更多子类型,check the docs for the rest

你的问题似乎是针对 JSON 个对象,JsObject 有一个 underlying: Map[String, JsValue],它是一个 Map,你应该可以很容易地遍历 keys/entries.

一些伪Scala代码(未编译):

val allowedValues = Set("name", "age", "job")
val parsedJson: JsValue = ....

parsedJson match {
  case jsonObject: JsObject =>
    val underlyingObjectValues = jsonObject.underlying
    val keysNotInAllowedSet = underlyingObjectValues.keys.diff(allowedValues)
    // Add keysNotInAllowedSet to the error list
  case _ => // Possible parse JsArray, etc.
}