根據您的情況,有幾種不同的方法。我可以想到四種不同的方式來有條件地要求一個領域。
依賴性
的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模式 –