リファレンス
配列
配列は順序付けられた要素に使用されます。JSONでは、配列内の各要素は異なる型である可能性があります。
Pythonでは、"配列"は使用状況に応じて、listまたはtuple型に類似しています。ただし、Python標準ライブラリのjsonモジュールは、常にPythonリストを使用してJSON配列を表します。
JSONでは、一般的に配列が使用される方法が2つあります。
- リスト検証: 各項目が同じスキーマに一致する、任意の長さのシーケンス。
- タプル検証: 各項目が異なるスキーマを持つ可能性のある、固定長のシーケンス。この使用法では、各項目のインデックス(または場所)は、値がどのように解釈されるかという点で重要です。(この使用法は、Pythonの
tupleなど、一部のプログラミング言語では完全に別の型として扱われることがよくあります)。
項目
リスト検証は、各項目が同じスキーマに一致する、任意の長さの配列に役立ちます。この種の配列については、items キーワードを、配列内のすべての項目を検証するために使用される単一のスキーマに設定します。
次の例では、配列内の各項目が数値であると定義しています。
1つの「非数値」があると、配列全体が無効になります。
空の配列は常に有効です。
タプル検証
タプル検証は、配列がそれぞれ異なるスキーマを持ち、各項目の序数インデックスが重要な項目のコレクションである場合に役立ちます。
たとえば、1600 Pennsylvania Avenue NWのような住所を、次の形式の4タプルとして表現できます。
[数値、street_name、street_type、direction]
これらの各フィールドは異なるスキーマを持ちます。
数値:住所番号。数値である必要があります。street_name:通りの名前。文字列である必要があります。street_type:通りの種類。固定された値のセットからの文字列である必要があります。direction:住所の市区画。別の値のセットからの文字列である必要があります。
これを行うには、prefixItemsキーワードを使用します。prefixItemsは配列であり、各項目は、ドキュメントの配列の各インデックスに対応するスキーマです。つまり、最初の要素が入力配列の最初の要素を検証し、2番目の要素が入力配列の2番目の要素を検証するなどの配列です。
itemsキーワードの別の形式で処理されていました。itemsが単一のスキーマではなくスキーマの配列だった場合、prefixItemsが動作するのと同じように動作しました。以下はスキーマの例です
"Drive" は、許可された道路の種類の一つではありません
この住所には番地がありません
すべての項目を提供しなくても問題ありません
また、デフォルトでは、最後に追加項目を追加することも可能です
追加の項目
items キーワードは、prefixItems で定義されたもの以外に、タプルに追加の項目を持たせることが有効かどうかを制御するために使用できます。items キーワードの値は、そのキーワードが検証をパスするために、追加のすべての項目が合格する必要のあるスキーマです。
additionalItems キーワードを使用して、タプルに追加される項目を制約していました。items と同じように機能しますが、名前が変更されただけです。items キーワードが存在しない場合、additionalItems キーワードは無視されます。ここでは、上記のスキーマ例を再利用しますが、items を false に設定します。これにより、タプル内の追加項目が許可されなくなります。
すべての項目を提供しなくても問題ありません。
ただし、items が false であるため、追加の項目を提供することはできません。
追加の項目が持つことができる値を制約するために、ブール値以外のスキーマを使用することで、より複雑な制約を表現できます。その場合、追加の項目はすべて文字列である限り許可されると言えます。
追加の文字列アイテムはOKです...
...しかし、それ以外はダメです。
未評価のアイテム
unevaluatedItems キーワードは、主に配列にアイテムを追加したり、許可しないようにしたりする場合に役立ちます。
unevaluatedItems は、items、prefixItems、またはcontains キーワードによって評価されなかったすべての値に適用されます。unevaluatedProperties がオブジェクト内のプロパティのみに影響を与えるのと同様に、unevaluatedItems は配列内のアイテムのみに影響します。
注意!「未評価」という言葉は、「items、prefixItems、またはcontains によって評価されなかった」という意味ではありません。「未評価」とは、「正常に評価されなかった」、または「trueとして評価されない」という意味です。
items と同様に、unevaluatedItems を false に設定すると、配列内の余分な項目を許可しないようにできます。
ここでは、すべての値が評価されます。スキーマは検証に合格します。
しかし、ここでは "unevaluatedItems": false が余分な値が存在してはならないことを指定しているため、スキーマは検証に失敗します。
items は、同じ サブスキーマ 内の allOf、anyOf、または oneOf の インスタンス を「内部から」認識しないことに注意してください。そのため、次の例では、items は allOf を無視し、検証に失敗します。
しかし、items を unevaluatedItems に置き換えると、同じ配列が検証されます。
また、「半クローズ」スキーマを作成することもできます。これは、最初の 2 つの引数を保持したいが、特定の状況ではさらに追加したい場合に役立ちます。(一部の場所では 2 つの引数に「クローズ」し、必要な場合はさらに多くの引数に「オープン」します。)
"$defs": { "closed": { "$anchor": "closed", "$ref": "#", "unevaluatedItems": false } }}
ここでは、スキーマは2つの配列項目に対して「クローズ」されています。その後、$ref を使用して、次のように別の項目を追加できます。
"$defs": { "closed": { "$anchor": "closed", "$ref": "#", "unevaluatedItems": false } }}
したがって、2つのアイテムだけが必要な場合はmy-tuple#closedを参照し、3つのアイテムが必要な場合はmy-tuple#extendedを参照します。
包含
itemsスキーマは配列内のすべてのアイテムに対して有効である必要がありますが、containsスキーマは配列内の1つ以上のアイテムに対してのみ検証する必要があります。
この条件をパスするには、単一の "number" で十分です
しかし、数値がないと失敗します
もちろん、すべて数値でも問題ありません
minContains / maxContains
minContains と maxContains は、contains と組み合わせて、スキーマが contains 制約に一致する回数をさらに指定できます。これらのキーワードには、ゼロを含む非負の数を指定できます。
minContains に失敗します
maxContainsに失敗
長さ
配列の長さは、minItems および maxItems キーワードを使用して指定できます。各キーワードの値は、負でない数値でなければなりません。これらのキーワードは、リスト検証またはタプル検証のどちらを実行する場合でも機能します。
一意性
スキーマは、配列内の各アイテムが一意であることを保証できます。uniqueItems キーワードを true に設定するだけです。
空の配列は常にパスします
助けが必要ですか?
これらのドキュメントはお役に立ちましたか?
ドキュメントを素晴らしいものにするためにご協力ください!
JSON Schemaでは、他のすべての種類の貢献と同様に、ドキュメントの貢献を重視しています!