2016-08-02 348 views
16

在jsonSchema您可以指明定義字段是否是強制性的或者是不使用「必需的」屬性:jsonSchema屬性條件必需

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "properties": { 
     "header": { 
      "type": "object", 
      "properties": { 
       "messageName": { 
        "type": "string" 
       }, 
       "messageVersion": { 
        "type": "string" 
       } 
      }, 
      "required": [ 
       "messageName", 
       "messageVersion" 
      ] 
     } 
    }, 
    "required": [ 
     "header" 
    ] 
} 

在某些情況下,我想messageVersion領域不具有強制性。有沒有辦法使這個領域的強制性有條件?

+0

是的,應該是可以的。數據中的哪些信息會觸發強制性? – jruizaranguren

+0

如何在版本3中執行此操作? –

+0

@SarveswaranMeenakshiSundaram - 我不知道我只使用了v4的json模式 –

回答

41

根據您的情況,有幾種不同的方法。我可以想到四種不同的方式來有條件地要求一個領域。

依賴性

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)增加了ifthenelse關鍵字。 如果 「foo」 的屬性等於 「吧」,那麼 「欄」 屬性是必需的

{ 
    "type": "object", 
    "properties": { 
    "foo": { "type": "string" }, 
    "bar": { "type": "string" } 
    }, 
    "if": { 
    "properties": { 
     "foo": { "enum": ["bar"] } 
    } 
    }, 
    "then": { "required": ["bar"] } 
} 

編輯2017年12月23日:蘊涵部分更新和IF-THEN-ELSE部分加入。

+2

真棒回答,謝謝。這完全解決了我的情況! –

+0

這只是一個有用的參考。每天回來:) – Owen