具有未知属性的对象的 AJV 模式验证

AJV schema validation for object with unknown properties

我的平台上都有一个有趣的场景,但我相信它是最好的。我正在尝试验证 JSON 架构,其中对象具有未知键,架构与值相同。键是唯一 ID,这些键的值具有相同的架构。

为了理解,我用一个示例代码来解释一下:

let survey_questions = {
  "vv4sD32": {
    question: "Do you like dogs?",
    answers: ["Yes", "No"]
  },
  "df4sdIU": {
    question: "How about cats?",
    answers: ["Maybe", "Maybe not"]
  },
  "cbkle12": {
    question: "What do you prefer most?",
    answers: ["Dogs", "Cats"]
  }
}

如您所见,该示例是一项调查,其中键是问题的唯一 ID,值是具有共享模式的对象。我知道我可以遍历它们并检查每个单独问题的架构,但我有此类嵌套事物的示例,并且会使事情复杂化很多。对如何使用 AJV 或任何其他库执行此操作有何建议?

谢谢,

卡利诺

Any suggestions how to do this with AJV or any other library?

如果您对基于结构模式的简单方法持开放态度,请继续阅读。

command-line 程序可用于检查 JSON 模式。

这可以通过多种方式完成。在此回复中,我将重点介绍 schema-inference 引擎(我编写的)的使用,该引擎位于 https://gist.github.com/pkoppstein/a5abb4ebef3b0f72a6ed

此推理引擎以 JSON 文档的形式生成 easy-to-read 架构,该架构与正在检查的 JSON 实体具有相同的结构。

为了说明,我们首先假设:

  • 名为 survey_questions.json 的文件根据 OP 中 "survey_questions" 对象建议的行保持有效 JSON。

  • above-mentionedschema.jq文件已经下载到目录~/.jq/schema/

现在像这样在命令行调用 jq:

jq 'include "schema" {"search": "~/.jq"}; [.[]] | schema
' survey_questions.json 

生成推断的结构模式:

{
  "question": "string",
  "answers": [
    "string"
  ]
}

可以这样理解:每个问题是一个JSON对象,最多有两个键:

  • 一个名为 "question"

  • 的 string-valued 键
  • 一个名为 "answers" 的键,它始终是一个字符串数组。

请注意,schema.jq 没有做出关于 数组的长度。检查每个 "answers" 数组是否有 至少 2 的长度必须单独完成。

现在假设我们向允许的 "answers" 之一添加了第三个可能的值,一个数字。

那么推断的架构将是:

{
  "question": "string",
  "answers": [
    "scalar"
  ]
}

请注意 answers 现在被推断为标量数组。

总结

总而言之,如果一组 JSON 文档或实体的预期模式可以用 schema.jq 支持的 "structural" 方式表示,那么模式检查可以通过以下方式完成将推断的模式与预期的模式进行比较。

Any suggestions how to do this with AJV or any other library?

您可以使用 JSON 扩展结构模式语言,JESS, which now comes with a conformance checker (JESS.jq); it requires 到 运行。

在 JESS 中,模式由一个或多个 JSON 文本组成。您的要求可以通过以下架构指定:

[
  "&",
  {
    "forall": ".[]",
    "schema": {
      "question": "string",
      "answer": [
        "string"
      ]
    }
  }
]

这可以理解为:对于 top-level 键的所有值,检查该值是否是与指定模式匹配的对象。

要确定您的 survey_questions 是否有效,您可以(在安装 JESS 之后)使用 JESS 脚本,如下所示:

JESS --schema schema.json survey_questions.json

其中 schema.json 包含上述架构,survey_questions.json 包含要检查的 JSON。

注意:我是 JESS 存储库的作者。

如果有人还会研究这个,patternProperties https://ajv.js.org/json-schema.html#patternproperties 解决这个问题很好

这里有很好的答案。最后,我最终创建了自己的库,我已经使用了多年,并且最近变得非常流行。该库正在 https://www.npmjs.com/package/great-json-validator 检查数据类型“array-object”。文档有一个非常google的例子。