我想基于根模式中属性的存在,在数组子模式中应用附加的“必需”属性。我有这样的模式设置:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required":[
"isParentDependency",
"subArray"
],
"properties": {
"isParentDependency": {
"$id": "#/properties/isParentDependency",
"type": "boolean"
},
"subArray": {
"$id": "#/properties/subArray",
"type": "array",
"items": {
"$id": "#/properties/subArrayItem",
"required": ["alwaysRequiredProp"],
"dependencies": {
"isParentDependency":{
"required":["requiredPropIfIsParentDependency"]
}
},
"properties": {
"alwaysRequiredProp": {
"$id": "#/properties/subArray/items/properties/alwaysRequiredProp",
"type": "boolean"
},
"requiredPropIfIsParentDependency": {
"$id": "#/properties/subArray/items/properties/requiredPropIfIsParentDependency",
"type": "boolean"
}
}
}
}
}
}
传递案例
{
"isParentDependency": false,
"subArray": [{
"alwaysRequiredProp": true
}]
}
"isParentDependency": true,
"subArray": [{
"alwaysRequiredProp": true,
"requiredPropIfIsParentDependency":true
}]
}
失败案例
{
"isParentDependency": true,
"subArray": [{
"alwaysRequiredProp": true
}]
}
显然这是行不通的,但是我一直无法弄清楚如何制作指向根模式的指针(或使用$ ref来应用if / else类型的解决方案)
任何指导,不胜感激!
最佳答案
使用JSON模式,树下嵌套的每个properties
层都无法看到树。因此,您必须在需要查看的最顶层定义条件。在这种情况下,这就是根级别。
看一下这个模式。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"definitions": {
"subArray": {
"type": "array",
"items": {
"required": [
"alwaysRequiredProp"
],
"properties": {
"alwaysRequiredProp": {
"type": "boolean"
},
"requiredPropIfIsParentDependency": {
"type": "boolean"
}
}
}
}
},
"required": [
"isParentDependency",
"subArray"
],
"properties": {
"isParentDependency": {
"type": "boolean"
},
"subArray": {
"$ref": "#/definitions/subArray"
}
},
"if": {
"properties": {
"isParentDependency": {
"const": true
}
}
},
"then": {
"properties": {
"subArray": {
"items": {
"required": [
"requiredPropIfIsParentDependency"
]
}
}
}
}
}
subArray
已移至定义,然后被引用,因此可以更容易地看到条件应用程序逻辑。subArray
的定义仅确定项目结构的属性(如果已提供),并且需要alwaysRequiredProp
。它不需要requiredPropIfIsParentDependency
。有条件的应用程序使用
if
和then
关键字进入。如果
if
模式为true,则将应用else
模式。if
的值是一个架构。适用于根级别。它要求isParentDependency
为true
(它本身不需要属性,因为它总是必需的。在if语句中要求该属性并不意味着始终需要该属性,除非else
是false
,但是我们甚至不在这里使用else
)。当
isParentDependency
是true
时,将应用then
模式,该模式将树向下看到subArray
的项目,需要requiredPropIfIsParentDependency
。您可以使用jsonschema.dev(已预加载此架构和您的失败实例)在浏览器中测试此功能。