我一直在尝试正确设置JSON模式。我有一个boolean
属性,必须根据该属性确定所需的属性。以下是我的示例JSON
,我想在没有item3
的情况下使验证失败。
{
"item1": true,
"item2": "ABC"
}
这是我要验证通过的JSON
{
"item1": true,
"item2": "ABC",
"item3": {
"subItem1": "ABC",
"subItem2": "BAC"
}
}
类似地,如果item1
为false
,则上述两个JSON的验证都应通过。
我的JSON模式如下。
{
"definitions": {},
"type": "object",
"title": "The Root Schema",
"properties": {
"item1": {
"$id": "#/properties/item1",
"type": "boolean",
"title": "The Item1 Schema",
"default": false,
"examples": [
true
]
},
"item2": {
"$id": "#/properties/item2",
"type": "string",
"title": "The Item2 Schema",
"default": "",
"examples": [
"ABC"
],
"pattern": "^(.*)$"
},
"item3": {
"$id": "#/properties/item3",
"type": "object",
"title": "The Item3 Schema",
"required": [
"subItem1",
"subItem2"
],
"properties": {
"subItem1": {
"$id": "#/properties/item3/properties/subItem1",
"type": "string",
"title": "The Subitem1 Schema",
"default": "",
"examples": [
"AAA"
],
"pattern": "^(.*)$"
},
"subItem2": {
"$id": "#/properties/item3/properties/subItem2",
"type": "string",
"title": "The Subitem2 Schema",
"default": "",
"examples": [
"BAC"
],
"pattern": "^(.*)$"
}
}
}
},
"required": ["item1"],
"allOf": [{
"if": {
"properties": {
"item1": {
"enum": [
true
]
}
}
},
"then": {
"required": [
"item2",
"item3"
]
},
"else": {
"required": [
"item2"
]
}
}]
}
我的验证总是失败。
如果item1
为真,则需要subItem2
。
如果item1
为假,则不需要item3
,但如果包含{{1}}仍应进行验证。
答案 0 :(得分:1)
根据验证,您的if
/ then
/ else
块可以正常工作。
您希望传递的示例JSON失败,因为您要求item3
的属性为subItem1
和subItem2
,但没有。
现在,您已经更新了示例JSON,该示例应传递给包含item3
和subItem1
的正确subItem2
,验证将通过您提供的模式传递。
此外,如果我理解正确,则需要:
如果item1为true,则必须为subItem2。如果item1为假,则 item3不是必需的,但如果包含的话,仍应进行验证。
将需要subItem3
的架构从item3
移动到您的then
子句。这样一来,只有在您的subItem3
模式成功验证(if
是item1
)时,才“需要” true
{
"definitions": {},
"type": "object",
"title": "The Root Schema",
"properties": {
"item1": {
"$id": "#/properties/item1",
"type": "boolean",
"title": "The Item1 Schema",
"default": false,
"examples": [
true
]
},
"item2": {
"$id": "#/properties/item2",
"type": "string",
"title": "The Item2 Schema",
"default": "",
"examples": [
"ABC"
],
"pattern": "^(.*)$"
},
"item3": {
"$id": "#/properties/item3",
"type": "object",
"title": "The Item3 Schema",
"required": [
"subItem1"
],
"properties": {
"subItem1": {
"$id": "#/properties/item3/properties/subItem1",
"type": "string",
"title": "The Subitem1 Schema",
"default": "",
"examples": [
"AAA"
],
"pattern": "^(.*)$"
},
"subItem2": {
"$id": "#/properties/item3/properties/subItem2",
"type": "string",
"title": "The Subitem2 Schema",
"default": "",
"examples": [
"BAC"
],
"pattern": "^(.*)$"
}
}
}
},
"required": [
"item1"
],
"allOf": [
{
"if": {
"properties": {
"item1": {
"enum": [
true
]
}
}
},
"then": {
"required": [
"item2",
"item3"
],
"properties": {
"item3": {
"required": [
"subItem2"
]
}
}
},
"else": {
"required": [
"item2"
]
}
}
]
}