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 而且我不太明白为什么...
即使 有效,我不确定在这种情况下我是否应该使用 anyOf
或 oneOf
。它是匹配所有数组项还是每个单独的数组项?
你说得有点不对。目前您的模式说...对于管道数组,所有项目都必须是 foo
或者所有项目都必须是 baz
.
您需要更改 anyOf
和 items
的位置...
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"
]
}
]
}
}
}
}
我正在使用 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 而且我不太明白为什么...
即使 有效,我不确定在这种情况下我是否应该使用 anyOf
或 oneOf
。它是匹配所有数组项还是每个单独的数组项?
你说得有点不对。目前您的模式说...对于管道数组,所有项目都必须是 foo
或者所有项目都必须是 baz
.
您需要更改 anyOf
和 items
的位置...
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"
]
}
]
}
}
}
}