使用数组时如何将 additionalProperties 设置为 false?

How do I set additionalProperties to false when using an array?

正在验证的文件如下所示:

MyArray:
  - someItemWithRandomName:
    one: f9jfw9j302
    two: 09dj0293jff
    three: 09dj0293jff
  - someOtherItemWithRandomName:
    one: f9jfw9j302
    two: 09dj0293jff
    three: 09dj0293jff
  - anotherItem:
    one: f9jfw9j302
    two: 09dj0293jff
    three: 09dj0293jff

我正在这样验证它:

"MyArray": {
  "type": "array",
  "items": {
    "type": "object",
    "additionalProperties": false,
    "required": [
      "one",
      "two",
      "three"
    ],
    "properties": {
      "one": {
          "type": "string"
      },
      "two": {
          "type": "string"
      },
      "three": {
          "type": "string"
      }
    }
  }

我不想允许架构中未定义的数组项中的字段,但 "additionalProperties": false 不起作用,因为数组项的键可以是任何字符串。你如何适应这个?

编辑

这是我验证的一个活生生的例子。我假设的 YAML 在验证之前将像本例中那样转换为 JSON:https://www.jsonschemavalidator.net/s/PBmLkkBl

您的架构中缺少一个级别,以允许将数组项的对象属性命名为任何内容。

试试这个:

"MyArray": {
  "type": "array",
  "items": {
    "type": "object",
    "additionalProperties": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "one",
        "two",
        "three"
      ],
      "properties": {
        "one": {
          "type": "string"
        },
        "two": {
          "type": "string"
        },
        "three": {
          "type": "string"
        }
      }
    }
  }

如果您想限制在该中间级别使用的名称,您可以将“additionalProperties”替换为“patternProperties”:

...
"patternProperties": {
  "^[0-9]$": {
    ...
  }
}

或者,如果您想为 属性 个名称使用架构,您可以使用“属性Names”。

https://json-schema.org/understanding-json-schema/reference/object.html

(代表问题作者发布解决方案将其移至答案space).

我的解决方案是只删除数组中的空项,因为它们没有被使用。我认为正确处理此问题的唯一方法是进行某种条件验证以允许所有属性具有空值 - 如果可能的话。