如何禁止json模式数组中的某些anyOf项多次出现



考虑以下json模式:

{
"type": "array",
"items": {
"anyOf":[
{ 
"type": "object",
"additionalProperties":false,
"properties": {
"foo":{"type":"string"}
}
},
{
"type": "object",
"additionalProperties":false,
"properties": {
"bar":{"type":"number"}
}
}
]
}
}

我怎么能指定,anyOf中的第一个模式可以无限期地出现,而第二个模式只能出现一次?

下面的json应该是有效因为它只包含一个与第二个anyOf模式匹配的元素:

[
{
"foo":"hello"
},
{
"foo":"world"
},
{
"bar":42
}
]

下面的json应该是invalid因为它包含多个与第二个anyOf模式匹配的元素:

[
{
"foo":"hello"
},
{
"foo":"world"
},
{
"bar":42
},
{
"bar":24
}
]

我正在寻找任何json-schema草案版本的解决方案。

在2019-09和2020-12草案中,您可以使用contains+minContains+maxContains来断言数组中最多可以出现一次。

{
"type": "array",
"items": {
"anyOf": [
{ "$ref": "#/$defs/foo-string" },
{ "$ref": "#/$defs/foo-number" }
]
},
"contains": { "$ref": "#/$defs/foo-string" },
"minContains": 0,
"maxContains": 1
}

在draft-04 - draft-07中,没有办法表达contains-only-one。您所能做的最好的事情是要求只能出现一次的内容始终是数组的第一项。这说明第一项可以是"foo-string"或";foo-number"其余的必须是"foo-number">

{
"type": "array",
"items": [
{
"anyOf": [
{ "$ref": "#/$defs/foo-string" },
{ "$ref": "#/$defs/foo-number" }
]
}
],
"additionalItems": { "$ref": "#/definitions/foo-number" }
}

相关内容

  • 没有找到相关文章

最新更新