參考

Schema 組合

JSON Schema 包含一些關鍵字,用於將 schema 組合在一起。請注意,這不一定表示從多個檔案或 JSON 樹組合 schema,儘管這些功能有助於實現這一點,並且在建構複雜的 schema中有描述。組合 schema 可能很簡單,例如允許針對多個條件同時驗證值。

這些關鍵字對應於眾所周知的布林代數概念,例如 AND、OR、XOR 和 NOT。您可以使用這些關鍵字來表示無法使用標準 JSON Schema 關鍵字表達的複雜約束。

用於組合 schema 的關鍵字是

  • allOf:(AND) 必須符合所有子 schema
  • anyOf:(OR) 必須符合任何子 schema
  • oneOf:(XOR) 必須符合恰好一個子 schema

所有這些關鍵字都必須設定為陣列,其中每個項目都是一個 schema。請小心使用遞迴 schema,因為它們可能會使處理時間呈指數級增長。

此外,還有

  • not:(NOT) 必須符合給定的 schema

allOf

若要針對 allOf 進行驗證,給定的資料必須符合所有給定的子 schema。

schema
{ "allOf": [ { "type": "string" }, { "maxLength": 5 } ]}
資料
"short"
符合綱要
資料
"too long"
不符合綱要

allOf 不能用於「擴展」綱要,以物件導向繼承的概念向其中添加更多細節。實例必須獨立地針對 allOf 中的「所有」綱要進行驗證。有關更多資訊,請參閱擴展封閉綱要章節。

anyOf

若要針對 anyOf 進行驗證,給定的資料必須針對任何(一個或多個)給定的子綱要有效。

schema
{ "anyOf": [ { "type": "string", "maxLength": 5 }, { "type": "number", "minimum": 0 } ]}
資料
"short"
符合綱要
資料
"too long"
不符合綱要
資料
12
符合綱要
資料
-5
不符合綱要

oneOf

若要針對 oneOf 進行驗證,給定的資料必須針對給定的子綱要中的「正好一個」有效。

schema
{ "oneOf": [ { "type": "number", "multipleOf": 5 }, { "type": "number", "multipleOf": 3 } ]}
資料
10
符合綱要
資料
9
符合綱要

不是 5 或 3 的倍數。

資料
2
不符合綱要

同時是 5 和 3 的倍數會被拒絕。

資料
15
不符合綱要
使用 oneOf 條目時應謹慎考慮,因為它的性質需要驗證每個子模式,這可能會導致處理時間增加。 盡可能優先使用 anyOf

not

not 關鍵字宣告,如果實例不符合給定的子模式,則該實例有效。

例如,以下模式驗證任何不是字串的內容

schema
{ "not": { "type": "string" } }
資料
42
符合綱要
資料
{ "key": "value" }
符合綱要
資料
"我是一個字串"
不符合綱要

模式組成的屬性

不合邏輯的模式

請注意,使用這些關鍵字很容易建立邏輯上不可能的模式。 以下範例建立了一個無法針對任何內容驗證的模式(因為某個東西不可能同時是字串和數字)

schema
{ "allOf": [ { "type": "string" }, { "type": "number" } ]}
資料
"沒門"
不符合綱要
資料
-1
不符合綱要

架構模式

請注意,可以將子模式的通用部分「分解」出來。以下兩種模式是等效的。

schema
{ "oneOf": [ { "type": "number", "multipleOf": 5 }, { "type": "number", "multipleOf": 3 } ]}
schema
{ "type": "number", "oneOf": [ { "multipleOf": 5 }, { "multipleOf": 3 } ]}

需要幫忙嗎?

您覺得這些文件對您有幫助嗎?

幫助我們讓文件更完善!

在 JSON Schema,我們重視文件貢獻,如同其他類型的貢獻一樣!

仍然需要幫忙嗎?

學習 JSON Schema 通常讓人感到困惑,但別擔心,我們在這裡提供協助!