我在整个平台上都有一个有趣的场景,但是我认为这是最好的。我正在尝试验证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
答案 0 :(得分:0)
有人建议如何使用AJV或其他任何库吗?
如果您愿意采用基于结构模式的简单方法,请继续阅读。
jq命令行程序可用于检查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);它需要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 可以很好地解决这个问题