JSON 架构 - 具有多个不同对象类型的数组

JSON Schema - array with multiple different object types

我正在使用 draft/2020-12 编写一个模式来验证多个对象的数组。我将使用 YAML 作为示例以提高可读性(并且将要验证的是 YAML 文档)。

我见过很多不同的方法,但 none 出于某种原因似乎做得很好。

要验证的数据

pipeline:
  - foo: abc
    someOption: 123
  - baz: def
    anotherOption: 223
  - foo: ghi

如您所见,pipeline 数组包含具有完全不同属性的对象。相同的对象类型可以出现多次(一个对象有 2 个实例包含 foo,它们将被视为相同的对象类型)。

架构

$id: 'https://example.com/schema'
$schema: 'https://json-schema.org/draft/2020-12/schema'
type: object
properties: 
  pipeline:
    type: array
    additionalItems: false
    anyOf:
      - items:
          type: object
          additionalProperties: false
          properties:
            foo:
              type: string
            someOption: 
              type: integer
          required: [foo]
      - items:
          type: object
          additionalProperties: false
          properties:
            baz: 
              type: string
            anotherOption:
              type: integer
          required: [baz]

对我来说,这看起来是正确的,尽管它 fails validation 而且我不太明白为什么...

即使 有效,我不确定在这种情况下我是否应该使用 anyOfoneOf。它是匹配所有数组项还是每个单独的数组项?

你说得有点不对。目前您的模式说...对于管道数组,所有项目都必须是 foo 或者所有项目都必须是 baz.

您需要更改 anyOfitems 的位置...

items 适用于数组中的每一项。 anyOf 检查任何子模式值是否对实例位置有效(在这种情况下,数组中的每个项目)。

{
  "$id": "https://example.com/schema",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "pipeline": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "foo": {
                "type": "string"
              },
              "someOption": {
                "type": "integer"
              }
            },
            "required": [
              "foo"
            ]
          }, {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "baz": {
                "type": "string"
              },
              "anotherOption": {
                "type": "integer"
              }
            },
            "required": [
              "baz"
            ]
          }
        ]
      }
    }
  }
}