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

问题描述 投票:0回答:5

我的平台上到处都有一个有趣的场景,但我相信这是最好的。我正在尝试验证 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 或任何其他库来做到这一点?

谢谢你,

卡利诺

javascript json schema ajv
5个回答
5
投票

如果有人仍然会研究这个问题,有

patternProperties
https://ajv.js.org/json-schema.html#patternproperties很好地解决了这个问题


0
投票

您可以使用

additionalProperties

例如,在您的情况下,它可能看起来像这样:

"additionalProperties": {
    type: "object",
    properties: {
        question: { type: string }
    }
}

您可以在此处查看更多详细信息:https://ajv.js.org/json-schema.html#additionalproperties


-1
投票

对于如何使用 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 对象:

  • 名为“question”的字符串值键

  • 一个名为“answers”的键,它始终是一个字符串数组。

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

现在假设我们将第三个可能的值(一个数字)添加到允许的“答案”之一。

那么推断的模式将是:

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

请注意,

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

总结

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


-1
投票

对于如何使用 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 存储库的作者。


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.