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

时间:2019-06-26 09:01:13

标签: javascript json schema ajv

我在整个平台上都有一个有趣的场景,但是我认为这是最好的。我正在尝试验证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或任何其他库执行此操作的任何建议?

谢谢

Carlino

3 个答案:

答案 0 :(得分:0)

  

有人建议如何使用AJV或其他任何库吗?

如果您愿意采用基于结构模式的简单方法,请继续阅读。

命令行程序可用于检查JSON模式。

这可以通过多种方式完成。在此响应中,我将重点介绍https://gist.github.com/pkoppstein/a5abb4ebef3b0f72a6ed

上提供的模式推断引擎(由我编写)的使用。

此推理引擎以JSON文档的形式生成易于阅读的架构,该文档与正在检查的JSON实体具有相同的结构。

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

  • 名为Survey_questions.json的文件按照OP中“ survey_questions”对象建议的方式保存有效的JSON。

  • 上述schema.jq文件已下载到目录〜/ .jq / schema /

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

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

产生推断的结构模式:

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

其含义如下:每个问题都是一个JSON对象,最多包含两个键:

  • 一个名为“问题”的字符串值键

  • 一个名为“答案”的键,该键始终是字符串数组。

请注意,schema.jq不会做出任何推断 数组的长度。检查每个“答案”数组是否具有 长度必须至少为2。

现在假设我们在一个允许的“答案”中添加了第三个可能的值,即数字。

那么推断的架构将是:

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

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

摘要

总而言之,如果可以以schema.jq支持的“结构”方式表示一组JSON文档或实体的预期模式,则可以通过将推断的模式与预期模式进行比较来完成模式检查。 / p>

答案 1 :(得分:0)

  

有人建议如何使用AJV或其他任何库吗?

您可以使用JSON扩展结构模式语言JESS,该语言现在带有一致性检查器(JESS.jq);它需要才能运行。

在JESS中,模式包含一个或多个JSON文本。您的要求可以通过以下模式指定:

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

这可以理解为:对于顶级键的所有值,请检查该值是否是与指示的模式匹配的对象。

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

JESS --schema schema.json survey_questions.json

其中schema.json保存上述架构,Survey_questions.json保存要检查的JSON。

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

答案 2 :(得分:0)

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