參考
Schema 組合
JSON Schema 包含一些關鍵字,用於將 schema 組合在一起。請注意,這不一定表示從多個檔案或 JSON 樹組合 schema,儘管這些功能有助於實現這一點,並且在建構複雜的 schema中有描述。組合 schema 可能很簡單,例如允許針對多個條件同時驗證值。
這些關鍵字對應於眾所周知的布林代數概念,例如 AND、OR、XOR 和 NOT。您可以使用這些關鍵字來表示無法使用標準 JSON Schema 關鍵字表達的複雜約束。
用於組合 schema 的關鍵字是
allOf
:(AND) 必須符合所有子 schemaanyOf
:(OR) 必須符合任何子 schemaoneOf
:(XOR) 必須符合恰好一個子 schema
所有這些關鍵字都必須設定為陣列,其中每個項目都是一個 schema。請小心使用遞迴 schema,因為它們可能會使處理時間呈指數級增長。
此外,還有
not
:(NOT) 必須不符合給定的 schema
allOf
若要針對 allOf
進行驗證,給定的資料必須符合所有給定的子 schema。
{ "allOf": [ { "type": "string" }, { "maxLength": 5 } ]}
資料
"short"
資料
"too long"
anyOf
若要針對 anyOf
進行驗證,給定的資料必須針對任何(一個或多個)給定的子綱要有效。
{ "anyOf": [ { "type": "string", "maxLength": 5 }, { "type": "number", "minimum": 0 } ]}
資料
"short"
資料
"too long"
資料
12
資料
-5
oneOf
若要針對 oneOf
進行驗證,給定的資料必須針對給定的子綱要中的「正好一個」有效。
{ "oneOf": [ { "type": "number", "multipleOf": 5 }, { "type": "number", "multipleOf": 3 } ]}
資料
10
資料
9
不是 5 或 3 的倍數。
資料
2
同時是 5 和 3 的倍數會被拒絕。
資料
15
使用
oneOf
條目時應謹慎考慮,因為它的性質需要驗證每個子模式,這可能會導致處理時間增加。 盡可能優先使用 anyOf
。not
not
關鍵字宣告,如果實例不符合給定的子模式,則該實例有效。
例如,以下模式驗證任何不是字串的內容
{ "not": { "type": "string" } }
資料
42
資料
{ "key": "value" }
資料
"我是一個字串"
模式組成的屬性
不合邏輯的模式
請注意,使用這些關鍵字很容易建立邏輯上不可能的模式。 以下範例建立了一個無法針對任何內容驗證的模式(因為某個東西不可能同時是字串和數字)
{ "allOf": [ { "type": "string" }, { "type": "number" } ]}
資料
"沒門"
資料
-1
架構模式
請注意,可以將子模式的通用部分「分解」出來。以下兩種模式是等效的。
{ "oneOf": [ { "type": "number", "multipleOf": 5 }, { "type": "number", "multipleOf": 3 } ]}
{ "type": "number", "oneOf": [ { "multipleOf": 5 }, { "multipleOf": 3 } ]}