根据您的情况,有几种不同的方法。我可以想到四种有条件地要求使用字段的方法。
依存关系
该dependencies
关键字是所述的一个条件变化required
关键字。中的Foreach属性dependencies
,如果该属性存在于正在验证的JSON中,则与该键关联的架构也必须有效。 如果存在“ foo”属性,则需要“ bar”属性
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
如果架构仅包含required
关键字,则还有一个简短形式。
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
意义
如果您的条件取决于字段的值,则可以使用称为蕴涵的布尔逻辑概念。“ A暗示B”有效地表示,如果A为true,则B也必须为true。含义也可以表示为“!A或B”。 “ foo”属性不等于“ bar”,或者“ bar”属性是必需的。或者,换句话说:如果“ foo”属性等于“ bar”,则“ bar”属性是必需的
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
如果“ foo”不等于“ bar”,则#/anyOf/0
匹配并验证成功。如果“ foo”等于“ bar”,则#/anyOf/0
失败,并且#/anyOf/1
必须有效才能使anyOf
验证成功。
枚举
如果您的条件是基于枚举的,那就更简单了。 “ foo”可以是“ bar”或“ baz”。如果“ foo”等于“ bar”,则需要“ bar”。如果“ foo”等于“ baz”,则需要“ baz”。
{
"type": "object",
"properties": {
"foo": { "enum": ["bar", "baz"] },
"bar": { "type": "string" },
"baz": { "type": "string" }
},
"anyOf": [
{
"properties": {
"foo": { "const": "bar" }
},
"required": ["bar"]
},
{
"properties": {
"foo": { "const": "baz" }
},
"required": ["baz"]
}
]
}
如果-然后-其他
一个相对较新除了JSON模式(草案-07)增加了if
,then
和else
关键字。 如果“ foo”属性等于“ bar”,则需要“ bar”属性
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
},
"then": { "required": ["bar"] }
}
编辑2017年12月23日:隐含部分已更新,而If-Then-Else部分已添加。
编辑06/04/2018: If-Then-Else的错误修正,并更新singleton enum
以使用const
。