首页 > 解决方案 > JSON模式递归似乎没有正确验证

问题描述

我正在浏览文档以尝试弄清楚循环是如何工作的,以便我可以验证对象数组中的每个对象都与架构匹配。

似乎递归是我想要的,但给出的示例不起作用:https ://json-schema.org/understanding-json-schema/structuring.html

我正在尝试验证该示例,但它始终“有效”。我尝试更改 JSON 中的所有字段名称,但这没关系:

在此处输入图像描述

不知道发生了什么。对于这个例子,我将如何验证每个孩子是否与人员模式匹配(而不是静态地写出模式中的每一个)。

例如,我想验证这个 JSON。toplevel在“objectsList”下可以有任意数量的对象和任意数量的对象。我想确保“objectsList”下的每个对象都具有正确的字段名称和类型(同样无需在架构中对整个事物进行硬编码):

{
  "toplevel": {
    "objectOne": {
      "objectsList": [
        {
          "field1": 1231,
          "field2": "sekfjlskjflsdf",
          "field3": ["ssss","eeee"],
        },
        {
          "field1": 11,
          "field2": "sef",
          "field3": ["eeee","qqqq"],
        },
        {
          "field1": 1231,
          "field2": "wwwww",
          "field3": ["sisjflkssss","esdfsdeee"],
        },
      ]
    },
    "objectTwo": {
      "objectsList": [
        {
          "field1": 99999,
          "field2": "yuyuyuyuyu",
          "field3": ["ssssuuu","eeeeeee"],
        },
        {
          "field1": 221,
          "field2": "vesdlkfjssef",
          "field3": ["ewerweeee","ddddq"],
        },
      ]
    },
  }
}

标签: jsonschema

解决方案


怎么了?

这里的问题不是递归——你的模式看起来不错。

根本问题与此处相同:https ://stackoverflow.com/a/61038256/5127499

JSON Schema 是为可扩展性而设计的。这意味着它允许添加任何类型的附加属性,只要它们不与已知/预期的关键字冲突。

解决方案

这里的解决方案是添加"additionalProperties": false您的“人”(来自屏幕截图)和顶级架构,以防止那些不正确的对象被接受。您的第二个示例也是如此:如果您不想允许定义这些无关属性,则必须"type": "object"添加任何定义。"additionalProperties": false

或者,您可以声明您的预期属性required以确保至少存在这些属性。


为什么?

根据json-schema.org/understanding-json-schema(强调我的):

additionalProperties关键字用于控制对额外内容的处理,即properties其名称未在 properties 关键字中列出。默认情况下,允许任何其他属性。

additionalProperties关键字可以是布尔值或对象。如果additionalProperties是布尔值并设置为 false,则不允许使用其他属性。


推荐阅读