【问题标题】:JSON schema recursion doesnt seem to properly validateJSON模式递归似乎没有正确验证
【发布时间】:2020-04-19 01:07:28
【问题描述】:

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

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

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

不确定发生了什么。对于这个例子,我将如何验证每个孩子都与 person 模式匹配(而不是在模式中静态地写出每一个)。

例如,我想验证这个 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


【解决方案1】:

怎么了?

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

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

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

解决方案

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

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


为什么?

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

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

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

【讨论】:

  • 令人失望的是他们自己的帮助文档中的官方示例不包括这一点。它会让它更清晰
  • @red888 对于您问题的最后一部分,如果您不关心属性名称而关心其内容,则必须包含 additionalProperties 并以对象/模式作为其值。
【解决方案2】:

解决您发布的屏幕截图以及实例通过的原因:

  1. 架构正在寻找 person 属性,但该属性不存在。
  2. 架构未声明person 是必需的。
  3. 该架构没有声明对未定义属性的要求,因此它始终会接受 personsdfsd 属性及其中的任何值,而无需进一步检查。

简而言之,您的 JSON 数据很糟糕,并且您的架构没有任何保护措施。

除此之外,您的架构看起来不错。它应该验证 children 属性中的项目是否与 person 定义的子架构匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-30
    • 2018-02-05
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多