根据您的情况,有几种不同的方法。我可以想到四种不同的方式来有条件地要求一个领域。
依赖性
的dependencies
关键字与关键字required
的有条件的变化。 Foreach属性dependencies
,如果该属性存在于正在验证的JSON中,则与该关键字相关联的模式也必须有效。 如果“foo”的属性存在,那么“栏中的”属性是必需的
{
"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是真的,那么B也必须是真的。含义也可以表示为“!A或B”。 “foo”属性不等于“bar”,或者需要“bar”属性。或者,换句话说:如果“foo”的属性等于“酒吧”,则需要
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "enum": ["bar"] }
},
"required": ["foo"]
}
},
{ "required": ["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": { "enum": ["bar"] }
},
"required": ["bar"]
},
{
"properties": {
"foo": { "enum": ["baz"] }
},
"required": ["baz"]
}
]
}
IF-THEN-ELSE
一个相对较新的JSON模式(草案-07)增加了if
,then
和else
关键字。 如果 “foo” 的属性等于 “吧”,那么 “栏” 属性是必需的
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "enum": ["bar"] }
}
},
"then": { "required": ["bar"] }
}
编辑2017年12月23日:蕴涵部分更新和IF-THEN-ELSE部分加入。
是的,应该是可以的。数据中的哪些信息会触发强制性? – jruizaranguren
如何在版本3中执行此操作? –
@SarveswaranMeenakshiSundaram - 我不知道我只使用了v4的json模式 –