假设我想在json中验证一个数组,其中只有第一个元素具有可选属性。数组中的其余项将需要该属性。
schema.json
{
"type": "object",
"properties": {
"x": {
"type": "array",
"items": {
"oneOf": [
{ "$ref": "./first.json" },
{ "$ref": "./rest.json" }
]
}
}
}
}
first.json
{
"type": "object",
"properties": {
"y": { "type": "number" },
"z": { "type": "boolean" }
},
"required": ["y"]
}
rest.json
{
"type": "object",
"properties": {
"y": { "type": "number" },
"z": { "type": "boolean" }
}
}
有效json:
{
"x": [
{ "z": true },
{ "y": 4, "z": true },
{ "y": 5 }
]
}
无效的json:
{
"x": [
{ "z": true },
{ "z": true }, // this line would be invalid
{ "y": 5 }
]
}
然而,上述设置给了我";多个模式匹配";当我提供y值时。另一种方法可能是:
schema.json
{
"type": "object",
"properties": {
"x": {
"type": "array",
"items": [
{ "$ref": "./first.json" },
{ "$ref": "./rest.json" }
]
}
}
}
这个模式对数组中的前两个元素执行我想要的操作(第一个元素不需要y,第二个元素需要yes(,但第二个之后的对象不应用任何模式。
items
关键字有两种形式。第一个是您正在使用的模式表单。二是数组形式。数组形式采用一个模式数组,其中每个模式应用于实例中相应的项。例如,当给定一个具有两个模式的数组时,它将对照第一个模式验证实例中的第一个项,对照第二个模式验证第二个项。
还有一个additionalItems
关键字与items
的数组形式配合使用。与items
中的模式不对应的任何项目都将根据additionalItems
模式进行验证。使用前面在items
中具有两个模式的示例,具有三个项的实例将根据additionalItems
模式评估其第三个项。
因此,我们可以使用items
的数组形式将./first.json
应用于第一个项目,并使用additionalItems
将./rest.json
应用于数组的其余部分。
{
"type": "object",
"properties": {
"x": {
"type": "array",
"items": [{ "$ref": "./first.json" }],
"additionalItems": { "$ref": "./rest.json" }
}
}
}