リファレンス
配列
配列は順序付けられた要素に使用されます。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では、他のすべての種類の貢献と同様に、ドキュメントの貢献を重視しています!