Json Schema数组中第一个元素需要不同的属性



假设我想在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"  }
}
}
}