リファレンス

配列

配列は順序付けられた要素に使用されます。JSONでは、配列内の各要素は異なる型である可能性があります。

言語固有の情報:
Python
Ruby
Objective-C
Swift

Pythonでは、"配列"は使用状況に応じて、listまたはtuple型に類似しています。ただし、Python標準ライブラリのjsonモジュールは、常にPythonリストを使用してJSON配列を表します。

スキーマ
{ "type": "array" }
データ
[1, 2, 3, 4, 5]
スキーマに準拠
データ
[3, "different", { "types": "of values" }]
スキーマに準拠
データ
{"Not": "an array"}
スキーマに準拠していません

JSONでは、一般的に配列が使用される方法が2つあります。

  • リスト検証: 各項目が同じスキーマに一致する、任意の長さのシーケンス。
  • タプル検証: 各項目が異なるスキーマを持つ可能性のある、固定長のシーケンス。この使用法では、各項目のインデックス(または場所)は、値がどのように解釈されるかという点で重要です。(この使用法は、Pythonのtupleなど、一部のプログラミング言語では完全に別の型として扱われることがよくあります)。

項目

リスト検証は、各項目が同じスキーマに一致する、任意の長さの配列に役立ちます。この種の配列については、items キーワードを、配列内のすべての項目を検証するために使用される単一のスキーマに設定します。

次の例では、配列内の各項目が数値であると定義しています。

スキーマ
{ "type": "array", "items": { "type": "number" }}
データ
[1, 2, 3, 4, 5]
スキーマに準拠

1つの「非数値」があると、配列全体が無効になります。

データ
[1, 2, "3", 4, 5]
スキーマに準拠していません

空の配列は常に有効です。

データ
[]
スキーマに準拠

タプル検証

タプル検証は、配列がそれぞれ異なるスキーマを持ち、各項目の序数インデックスが重要な項目のコレクションである場合に役立ちます。

たとえば、1600 Pennsylvania Avenue NWのような住所を、次の形式の4タプルとして表現できます。

データ
[数値, street_name, street_type, direction]

[数値、street_name、street_type、direction]

これらの各フィールドは異なるスキーマを持ちます。

  • 数値:住所番号。数値である必要があります。
  • street_name:通りの名前。文字列である必要があります。
  • street_type:通りの種類。固定された値のセットからの文字列である必要があります。
  • direction:住所の市区画。別の値のセットからの文字列である必要があります。

これを行うには、prefixItemsキーワードを使用します。prefixItemsは配列であり、各項目は、ドキュメントの配列の各インデックスに対応するスキーマです。つまり、最初の要素が入力配列の最初の要素を検証し、2番目の要素が入力配列の2番目の要素を検証するなどの配列です。

ドラフト固有の情報
ドラフト4〜2019-09では、タプル検証はitemsキーワードの別の形式で処理されていました。itemsが単一のスキーマではなくスキーマの配列だった場合、prefixItemsが動作するのと同じように動作しました。

以下はスキーマの例です

スキーマ
{ "type": "array", "prefixItems": [ { "type": "number" }, { "type": "string" }, { "enum": ["Street", "Avenue", "Boulevard"] }, { "enum": ["NW", "NE", "SW", "SE"] } ]}
データ
[1600, "Pennsylvania", "Avenue", "NW"]
スキーマに準拠

"Drive" は、許可された道路の種類の一つではありません

データ
[24, "Sussex", "Drive"]
スキーマに準拠していません

この住所には番地がありません

データ
["Palais de l'Élysée"]
スキーマに準拠していません

すべての項目を提供しなくても問題ありません

データ
[10, "Downing", "Street"]
スキーマに準拠

また、デフォルトでは、最後に追加項目を追加することも可能です

データ
[1600, "ペンシルベニア", "アベニュー", "NW", "ワシントン"]
スキーマに準拠

追加の項目

items キーワードは、prefixItems で定義されたもの以外に、タプルに追加の項目を持たせることが有効かどうかを制御するために使用できます。items キーワードの値は、そのキーワードが検証をパスするために、追加のすべての項目が合格する必要のあるスキーマです。

ドラフト4 - 2019-09
ドラフト 2020-12 以前は、additionalItems キーワードを使用して、タプルに追加される項目を制約していました。items と同じように機能しますが、名前が変更されただけです。
ドラフト6 - 2019-09
ドラフト6 - 2019-09 では、同じスキーマ内に「タプル検証」items キーワードが存在しない場合、additionalItems キーワードは無視されます。

ここでは、上記のスキーマ例を再利用しますが、itemsfalse に設定します。これにより、タプル内の追加項目が許可されなくなります。

スキーマ
{ "type": "array", "prefixItems": [ { "type": "number" }, { "type": "string" }, { "enum": ["Street", "Avenue", "Boulevard"] }, { "enum": ["NW", "NE", "SW", "SE"] } ], "items": false}
データ
[1600, "Pennsylvania", "Avenue", "NW"]
スキーマに準拠

すべての項目を提供しなくても問題ありません。

データ
[1600, "Pennsylvania", "Avenue"]
スキーマに準拠

ただし、itemsfalse であるため、追加の項目を提供することはできません。

データ
[1600, "ペンシルベニア", "アベニュー", "NW", "ワシントン"]
スキーマに準拠していません

追加の項目が持つことができる値を制約するために、ブール値以外のスキーマを使用することで、より複雑な制約を表現できます。その場合、追加の項目はすべて文字列である限り許可されると言えます。

スキーマ
{ "type": "array", "prefixItems": [ { "type": "number" }, { "type": "string" }, { "enum": ["Street", "Avenue", "Boulevard"] }, { "enum": ["NW", "NE", "SW", "SE"] } ], "items": { "type": "string" }}

追加の文字列アイテムはOKです...

データ
[1600, "ペンシルベニア", "アベニュー", "NW", "ワシントン"]
スキーマに準拠

...しかし、それ以外はダメです。

データ
[1600, "Pennsylvania", "Avenue", "NW", 20500]
スキーマに準拠していません

未評価のアイテム

ドラフト 2019-09 の新機能

unevaluatedItems キーワードは、主に配列にアイテムを追加したり、許可しないようにしたりする場合に役立ちます。

unevaluatedItems は、itemsprefixItems、またはcontains キーワードによって評価されなかったすべての値に適用されます。unevaluatedProperties がオブジェクト内のプロパティのみに影響を与えるのと同様に、unevaluatedItems は配列内のアイテムのみに影響します。

注意!「未評価」という言葉は、「itemsprefixItems、またはcontains によって評価されなかった」という意味ではありません。「未評価」とは、「正常に評価されなかった」、または「trueとして評価されない」という意味です。

items と同様に、unevaluatedItemsfalse に設定すると、配列内の余分な項目を許可しないようにできます。

スキーマ
{ "prefixItems": [ { "type": "string" }, { "type": "number" } ], "unevaluatedItems": false}

ここでは、すべての値が評価されます。スキーマは検証に合格します。

データ
["foo", 42]
スキーマに準拠

しかし、ここでは "unevaluatedItems": false が余分な値が存在してはならないことを指定しているため、スキーマは検証に失敗します。

データ
["foo", 42, null]
スキーマに準拠していません

items は、同じ サブスキーマ 内の allOfanyOf、または oneOfインスタンス を「内部から」認識しないことに注意してください。そのため、次の例では、itemsallOf を無視し、検証に失敗します。

スキーマ
{ "allOf": [{ "prefixItems": [{ "type": "boolean" }, { "type": "string" }] }], "items": { "const": 2 }}
データ
[true, "a", 2]
スキーマに準拠していません

しかし、itemsunevaluatedItems に置き換えると、同じ配列が検証されます。

スキーマ
{ "allOf": [{ "prefixItems": [{ "type": "boolean" }, { "type": "string" }] }], "unevaluatedItems": { "const": 2 }}
データ
[true, "a", 2]
スキーマに準拠

また、「半クローズ」スキーマを作成することもできます。これは、最初の 2 つの引数を保持したいが、特定の状況ではさらに追加したい場合に役立ちます。(一部の場所では 2 つの引数に「クローズ」し、必要な場合はさらに多くの引数に「オープン」します。)

スキーマ
{ "$id": "https://example.com/my-tuple", "type": "array", "prefixItems": [ { "type": "boolean" }, { "type": "string" } ],
"$defs": { "closed": { "$anchor": "closed", "$ref": "#", "unevaluatedItems": false } }}

ここでは、スキーマは2つの配列項目に対して「クローズ」されています。その後、$ref を使用して、次のように別の項目を追加できます。

スキーマ
{ "$id": "https://example.com/my-extended-tuple", "$ref": "https://example.com/my-tuple", "prefixItems": [ { "type": "boolean" }, { "type": "string" }, { "type": "number" } ],
"$defs": { "closed": { "$anchor": "closed", "$ref": "#", "unevaluatedItems": false } }}

したがって、2つのアイテムだけが必要な場合はmy-tuple#closedを参照し、3つのアイテムが必要な場合はmy-tuple#extendedを参照します。

包含

ドラフト6で新規追加

itemsスキーマは配列内のすべてのアイテムに対して有効である必要がありますが、containsスキーマは配列内の1つ以上のアイテムに対してのみ検証する必要があります。

スキーマ
{ "type": "array", "contains": { "type": "number" }}

この条件をパスするには、単一の "number" で十分です

データ
["life", "universe", "everything", 42]
スキーマに準拠

しかし、数値がないと失敗します

データ
["life", "universe", "everything", "forty-two"]
スキーマに準拠していません

もちろん、すべて数値でも問題ありません

データ
[1, 2, 3, 4, 5]
スキーマに準拠

minContains / maxContains

ドラフト 2019-09 の新機能

minContainsmaxContains は、contains と組み合わせて、スキーマが contains 制約に一致する回数をさらに指定できます。これらのキーワードには、ゼロを含む非負の数を指定できます。

スキーマ
{ "type": "array", "contains": { "type": "number" }, "minContains": 2, "maxContains": 3}

minContains に失敗します

データ
["apple", "orange", 2]
スキーマに準拠していません
データ
["apple", "orange", 2, 4]
スキーマに準拠
データ
["apple", "orange", 2, 4, 8]
スキーマに準拠

maxContainsに失敗

データ
["apple", "orange", 2, 4, 8, 16]
スキーマに準拠していません

長さ

配列の長さは、minItems および maxItems キーワードを使用して指定できます。各キーワードの値は、負でない数値でなければなりません。これらのキーワードは、リスト検証またはタプル検証のどちらを実行する場合でも機能します。

スキーマ
{ "type": "array", "minItems": 2, "maxItems": 3}
データ
[]
スキーマに準拠していません
データ
[1]
スキーマに準拠していません
データ
[1, 2]
スキーマに準拠
データ
[1, 2, 3]
スキーマに準拠
データ
[1, 2, 3, 4]
スキーマに準拠していません

一意性

スキーマは、配列内の各アイテムが一意であることを保証できます。uniqueItems キーワードを true に設定するだけです。

スキーマ
{ "type": "array", "uniqueItems": true}
データ
[1, 2, 3, 4, 5]
スキーマに準拠
データ
[1, 2, 3, 3, 4]
スキーマに準拠していません

空の配列は常にパスします

データ
[]
スキーマに準拠

助けが必要ですか?

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

ドキュメントを素晴らしいものにするためにご協力ください!

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

まだ助けが必要ですか?

JSON Schemaを学ぶことはしばしば混乱を招きますが、心配しないでください。私たちがお手伝いします!