当预先不知道架构时,如何遍历 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 个您感兴趣的子类型:JsObject
和 JsArray
(还有更多子类型,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.
}
我一直在阅读 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 个您感兴趣的子类型:JsObject
和 JsArray
(还有更多子类型,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.
}