参照

スキーマの合成

JSON スキーマには、スキーマを組み合わせるためのいくつかのキーワードが含まれています。これは必ずしも複数のファイルやJSONツリーからのスキーマの結合を意味するわけではありませんが、これらの機能はそれを実現するのに役立ち、複雑なスキーマの構造化で説明されています。スキーマの結合は、値が同時に複数の基準に対して検証されることを許可するほど単純な場合があります。

これらのキーワードは、AND、OR、XOR、NOTのようなよく知られたブール代数の概念に対応しています。これらのキーワードは、標準的なJSONスキーマキーワードでは表現できない複雑な制約を表現するために使用されることがよくあります。

スキーマを組み合わせるために使用されるキーワードは次のとおりです。

  • allOf: (AND) すべてのサブスキーマに対して有効である必要があります。
  • anyOf: (OR) サブスキーマのいずれか1つに対して有効である必要があります。
  • oneOf: (XOR) サブスキーマのちょうど1つに対して有効である必要があります。

これらのキーワードはすべて配列に設定する必要があります。各項目はスキーマです。再帰的なスキーマには注意してください。処理時間が指数関数的に増加する可能性があります。

さらに、次のものがあります。

  • not: (NOT) 指定されたスキーマに対して有効ではありません。

allOf

allOfに対して検証するには、指定されたデータが指定されたすべてのサブスキーマに対して有効である必要があります。

スキーマ
{ "allOf": [ { "type": "string" }, { "maxLength": 5 } ]}
データ
"short"
スキーマに準拠
データ
"too long"
スキーマに準拠せず

allOf は、オブジェクト指向の継承の意味で、スキーマに詳細を追加するためにスキーマを「拡張」するために使用することはできません。インスタンスは、allOf内のすべてのスキーマに対して個別に有効である必要があります。閉じたスキーマの拡張に関するセクションで詳細を参照してください。

anyOf

anyOfに対して検証するには、与えられたデータは、与えられたサブスキーマのいずれか(1つ以上)に対して有効である必要があります。

スキーマ
{ "anyOf": [ { "type": "string", "maxLength": 5 }, { "type": "number", "minimum": 0 } ]}
データ
"short"
スキーマに準拠
データ
"too long"
スキーマに準拠せず
データ
12
スキーマに準拠
データ
-5
スキーマに準拠せず

oneOf

oneOfに対して検証するには、与えられたデータは、与えられたサブスキーマのちょうど1つに対して有効である必要があります。

スキーマ
{ "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" }
スキーマに準拠
データ
"I am a string"
スキーマに準拠せず

スキーマ合成のプロパティ

論理的に矛盾するスキーマ

これらのキーワードを使うと、論理的に不可能なスキーマを簡単に作成できることに注意してください。次の例では、(文字列と数値を同時に満たすことはできないため)何も検証されないスキーマを作成します。

スキーマ
{ "allOf": [ { "type": "string" }, { "type": "number" } ]}
データ
"No way"
スキーマに準拠せず
データ
-1
スキーマに準拠せず

スキーマのファクタリング

サブスキーマの共通部分を「ファクタリング」できることに注意してください。次の2つのスキーマは同等です。

スキーマ
{ "oneOf": [ { "type": "number", "multipleOf": 5 }, { "type": "number", "multipleOf": 3 } ]}
スキーマ
{ "type": "number", "oneOf": [ { "multipleOf": 5 }, { "multipleOf": 3 } ]}

ヘルプが必要ですか?

このドキュメントは役に立ちましたか?

ドキュメントを改善するためにご協力ください!

JSON Schemaでは、あらゆる種類の貢献と同様に、ドキュメントへの貢献を重視しています!

それでもヘルプが必要ですか?

JSON Schemaの学習はしばしば混乱を招きますが、ご心配なく、お手伝いさせていただきます!