考虑以下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" }
}