Mik*_*ler 5 javascript jsonschema ajv
我想根据根模式中属性的存在,在数组子模式中应用一个额外的“必需”属性。我的架构设置如下:
{
"$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"
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
{
"isParentDependency": false,
"subArray": [{
"alwaysRequiredProp": true
}]
}
Run Code Online (Sandbox Code Playgroud)
"isParentDependency": true,
"subArray": [{
"alwaysRequiredProp": true,
"requiredPropIfIsParentDependency":true
}]
}
Run Code Online (Sandbox Code Playgroud)
{
"isParentDependency": true,
"subArray": [{
"alwaysRequiredProp": true
}]
}
Run Code Online (Sandbox Code Playgroud)
显然这行不通,但我一直无法弄清楚如何指向根模式(或应用带有 $ref 的 if/else 类型解决方案)
非常感谢任何指导!
使用 JSON Schema,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"
]
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
subArray 已移至定义然后引用,因此可以更容易地看到条件应用程序逻辑。
的定义subArray仅确定项目结构的属性(如果提供),并且需要alwaysRequiredProp. 它不需要requiredPropIfIsParentDependency.
条件应用程序使用if和then关键字。
如果if架构为真,则else应用架构。
的值if是一个模式。它适用于根级别。它需要isParentDependency是true(它不需要属性本身,因为它总是必需的。在 if 语句中需要属性并不意味着总是需要属性,除非elsewas false,但我们甚至没有else在这里使用)。
当isParentDependency是 时true,then应用模式,它向下查找树到subArray的项目,需要requiredPropIfIsParentDependency.
您可以使用jsonschema.dev(预加载此架构和您的失败实例)在浏览器中测试此工作。