リファレンス

オブジェクト

オブジェクトはJSONにおけるマッピング型です。オブジェクトは「キー」を「値」にマッピングします。JSONでは、「キー」は常に文字列でなければなりません。これらのペアのそれぞれは、慣例的に「プロパティ」と呼ばれます。

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

Pythonでは、「オブジェクト」はdict型に類似しています。ただし、重要な違いとして、Pythonの辞書ではキーとしてハッシュ可能なものなら何でも使用できますが、JSONではすべてのキーが文字列でなければなりません。

ここでの「オブジェクト」という単語の2つの用法に混乱しないようにしてください。Pythonは、すべてに対する汎用的な基底クラスを意味するためにobjectという単語を使用しますが、JSONでは文字列キーから値へのマッピングを意味するためのみに使用されます。

スキーマ
{ "type": "object" }
データ
{ "key": "value", "another_key": "another_value"}
スキーマに準拠
データ
{ "Sun": 1.9891e30, "Jupiter": 1.8986e27, "Saturn": 5.6846e26, "Neptune": 10.243e25, "Uranus": 8.6810e25, "Earth": 5.9736e24, "Venus": 4.8685e24, "Mars": 6.4185e23, "Mercury": 3.3022e23, "Moon": 7.349e22, "Pluto": 1.25e22}
スキーマに準拠

JSONでは文字列以外をキーとして使用することは無効です。

データ
{ 0.01: "cm", 1: "m", 1000: "km"}
スキーマに準拠していません
データ
"オブジェクトではありません"
スキーマに準拠していません
データ
["An", "array", "not", "an", "object"]
スキーマに準拠していません

プロパティ

オブジェクトのプロパティ(キーと値のペア)は、properties キーワードを使って定義します。propertiesの値はオブジェクトであり、各キーはプロパティの名前、各値はそのプロパティを検証するために使用されるスキーマです。propertiesキーワードのプロパティ名と一致しないプロパティは、このキーワードによって無視されます。

propertiesのプロパティ名と一致しないプロパティを許可しない方法については、追加プロパティおよび評価されないプロパティを参照してください。

例えば、番号、通りの名前、通りの種類で構成される住所のシンプルなスキーマを定義したいとします。

スキーマ
{ "type": "object", "properties": { "number": { "type": "number" }, "street_name": { "type": "string" }, "street_type": { "enum": ["Street", "Avenue", "Boulevard"] } }}
データ
{ "number": 1600, "street_name": "Pennsylvania", "street_type": "Avenue" }
スキーマに準拠

// 型が間違った数値が提供された場合、それは無効です。

データ
{ "number": "1600", "street_name": "Pennsylvania", "street_type": "Avenue" }
スキーマに準拠していません

デフォルトでは、プロパティを省略することは有効です。「必須プロパティ」を参照してください。

データ
{ "number": 1600, "street_name": "Pennsylvania" }
スキーマに準拠

拡張として、空のオブジェクトでさえ有効です

データ
{ }
スキーマに準拠

デフォルトでは、追加のプロパティを提供することは有効です

データ
{ "number": 1600, "street_name": "Pennsylvania", "street_type": "Avenue", "direction": "NW" }
スキーマに準拠

パターンプロパティ

特定の種類のプロパティ名が与えられた場合、値が特定のスキーマに一致する必要があるということを言いたい場合があります。それがpatternPropertiesの出番です。これは正規表現をスキーマにマッピングします。プロパティ名が指定された正規表現に一致する場合、プロパティ値は対応するスキーマに対して検証される必要があります。

正規表現はアンカーされていません。これは、patternPropertiesの正規表現を定義する場合、式がプロパティ名のどこにでも一致する可能性があることに注意することが重要であることを意味します。たとえば、正規表現"p"は、"apple"のように、pを含む任意のプロパティ名と一致します。名前が単に"p"であるプロパティだけではありません。したがって、通常は、正規表現を^...$で囲む方がわかりやすいです。たとえば、"^p$"

この例では、名前がプレフィックスS_で始まるプロパティはすべて文字列である必要があり、プレフィックスI_で始まるプロパティはすべて整数である必要があります。どちらの正規表現にも一致しないプロパティはすべて無視されます。

スキーマ
{ "type": "object", "patternProperties": { "^S_": { "type": "string" }, "^I_": { "type": "integer" } }}
データ
{ "S_25": "This is a string" }
スキーマに準拠
データ
{ "I_0": 42 }
スキーマに準拠

名前が S_ で始まる場合、それは文字列でなければなりません。

データ
{ "S_0": 42 }
スキーマに準拠していません

名前が I_ で始まる場合、それは整数でなければなりません。

データ
{ "I_42": "This is a string" }
スキーマに準拠していません

これは、どの正規表現にも一致しないキーです。

データ
{ "keyword": "value" }
スキーマに準拠

追加のプロパティ

additionalProperties キーワードは、properties キーワードにリストされていない名前や、patternProperties キーワードの正規表現に一致しないプロパティなど、追加のものを処理する方法を制御するために使用されます。デフォルトでは、追加のプロパティはすべて許可されます。

additionalProperties キーワードの値は、インスタンス内で、properties または patternProperties に一致しないプロパティを検証するために使用されるスキーマです。additionalProperties スキーマを false に設定すると、追加のプロパティは許可されなくなります。

プロパティの例を再利用しますが、今回は additionalPropertiesfalse に設定します。

スキーマ
{ "type": "object", "properties": { "number": { "type": "number" }, "street_name": { "type": "string" }, "street_type": { "enum": ["Street", "Avenue", "Boulevard"] } }, "additionalProperties": false}
データ
{ "number": 1600, "street_name": "Pennsylvania", "street_type": "Avenue" }
スキーマに準拠

additionalPropertiesfalse であるため、この余分なプロパティ "direction" はオブジェクトを無効にします。

データ
{ "number": 1600, "street_name": "Pennsylvania", "street_type": "Avenue", "direction": "NW" }
スキーマに準拠していません

インスタンスの追加プロパティに対して、より複雑な制約を課すために、ブール値以外のスキーマを使用できます。たとえば、追加プロパティを許可するが、それらの値がそれぞれ文字列である場合に限る、ということが可能です。

スキーマ
{ "type": "object", "properties": { "number": { "type": "number" }, "street_name": { "type": "string" }, "street_type": { "enum": ["Street", "Avenue", "Boulevard"] } }, "additionalProperties": { "type": "string" }}
データ
{ "number": 1600, "street_name": "Pennsylvania", "street_type": "Avenue" }
スキーマに準拠

これは、追加プロパティの値が文字列であるため、有効です。

データ
{ "number": 1600, "street_name": "Pennsylvania", "street_type": "Avenue", "direction": "NW" }
スキーマに準拠

これは、追加プロパティの値が文字列ではないため、無効です。

データ
{ "number": 1600, "street_name": "Pennsylvania", "street_type": "Avenue", "office_number": 201 }
スキーマに準拠していません

additionalProperties は、properties および patternProperties と組み合わせて使用できます。以下の例では、patternProperties の例に基づいて、数値でなければならない "builtin" プロパティを追加し、(properties で定義されておらず、patternProperties で一致しない) 追加のすべてのプロパティは文字列でなければならないと宣言します。

スキーマ
{ "type": "object", "properties": { "builtin": { "type": "number" } }, "patternProperties": { "^S_": { "type": "string" }, "^I_": { "type": "integer" } }, "additionalProperties": { "type": "string" }}
データ
{ "builtin": 42 }
スキーマに準拠

これは、どの正規表現にも一致しないキーです。

データ
{ "keyword": "value" }
スキーマに準拠

文字列である必要があります。

データ
{ "keyword": 42 }
スキーマに準拠していません

クローズドスキーマの拡張

additionalProperties は、それ自身と同じサブスキーマで宣言されたプロパティのみを認識することに注意することが重要です。したがって、additionalProperties は、組み合わせキーワード(allOfなど)を使用してスキーマを「拡張」することを制限する可能性があります。次の例では、additionalProperties が、住所スキーマの例を拡張しようとする試行を失敗させる可能性があることを確認できます。

スキーマ
{ "allOf": [ { "type": "object", "properties": { "street_address": { "type": "string" }, "city": { "type": "string" }, "state": { "type": "string" } }, "required": ["street_address", "city", "state"], "additionalProperties": false } ],
"properties": { "type": { "enum": [ "residential", "business" ] } }, "required": ["type"]}

additionalPropertiesが失敗します。「type」は追加とみなされます。

データ
{ "street_address": "1600 Pennsylvania Avenue NW", "city": "Washington", "state": "DC", "type": "business"}
スキーマに準拠していません

required に失敗しました。「type」は必須です。

データ
{ "street_address": "1600 Pennsylvania Avenue NW", "city": "Washington", "state": "DC"}
スキーマに準拠していません

additionalProperties は、同じサブスキーマで宣言されたプロパティのみを認識するため、「street_address」、「city」、「state」以外のものはすべて追加プロパティと見なします。allOf でスキーマを組み合わせても、それは変わりません。使用できる回避策は、additionalProperties を拡張スキーマに移動し、拡張スキーマのプロパティを再宣言することです。

スキーマ
{ "allOf": [ { "type": "object", "properties": { "street_address": { "type": "string" }, "city": { "type": "string" }, "state": { "type": "string" } }, "required": ["street_address", "city", "state"] } ],
"properties": { "street_address": true, "city": true, "state": true, "type": { "enum": [ "residential", "business" ] } }, "required": ["type"], "additionalProperties": false}
データ
{ "street_address": "1600 Pennsylvania Avenue NW", "city": "Washington", "state": "DC", "type": "business"}
スキーマに準拠
データ
{ "street_address": "1600 Pennsylvania Avenue NW", "city": "Washington", "state": "DC", "type": "business", "something that doesn't belong": "hi!"}
スキーマに準拠していません

さて、additionalProperties キーワードは、必要なプロパティをすべて認識し、スキーマが期待どおりに動作するようになりました。 unevaluatedProperties キーワードが、プロパティを再宣言する必要なくこの問題をどのように解決するかについて、読み進めてください。

評価されていないプロパティ

ドラフト 2019-09 で新規

前のセクションでは、結合を使用してスキーマを「拡張」する際のadditionalPropertiesの使用における課題について説明しました。unevaluatedPropertiesキーワードは、サブスキーマで宣言されたプロパティを認識できるという点を除いて、additionalPropertiesに似ています。したがって、前のセクションの例は、プロパティを再宣言する必要なく書き直すことができます。

スキーマ
{ "allOf": [ { "type": "object", "properties": { "street_address": { "type": "string" }, "city": { "type": "string" }, "state": { "type": "string" } }, "required": ["street_address", "city", "state"] } ],
"properties": { "type": { "enum": ["residential", "business"] } }, "required": ["type"], "unevaluatedProperties": false}
データ
{ "street_address": "1600 Pennsylvania Avenue NW", "city": "Washington", "state": "DC", "type": "business"}
スキーマに準拠
データ
{ "street_address": "1600 Pennsylvania Avenue NW", "city": "Washington", "state": "DC", "type": "business", "something that doesn't belong": "hi!"}
スキーマに準拠していません

unevaluatedPropertiesは、スキーマを処理する際に正常に検証されたプロパティを収集し、それらを許可されたプロパティのリストとして使用することで機能します。これにより、条件付きでプロパティを追加するなどの、より複雑な処理が可能になります。次の例では、アドレスの「タイプ」が「ビジネス」の場合にのみ、「department」プロパティを許可します。

スキーマ
{ "type": "object", "properties": { "street_address": { "type": "string" }, "city": { "type": "string" }, "state": { "type": "string" }, "type": { "enum": ["residential", "business"] } }, "required": ["street_address", "city", "state", "type"],
"if": { "type": "object", "properties": { "type": { "const": "business" } }, "required": ["type"] }, "then": { "properties": { "department": { "type": "string" } } },
"unevaluatedProperties": false}
データ
{ "street_address": "1600 Pennsylvania Avenue NW", "city": "Washington", "state": "DC", "type": "business", "department": "HR"}
スキーマに準拠
データ
{ "street_address": "1600 Pennsylvania Avenue NW", "city": "Washington", "state": "DC", "type": "residential", "department": "HR"}
スキーマに準拠していません

このスキーマでは、then スキーマで宣言されたプロパティは、アドレスの "type" が "business" の場合にのみ「評価済み」プロパティとしてカウントされます。

必須プロパティ

デフォルトでは、properties キーワードで定義されたプロパティは必須ではありません。ただし、required キーワードを使用して、必須プロパティのリストを提供できます。

required キーワードは、ゼロ個以上の文字列の配列を受け取ります。これらの文字列はそれぞれ一意である必要があります。

ドラフト固有の情報
ドラフト4では、required は少なくとも1つの文字列を含む必要があります。

次のユーザーレコードを定義するスキーマの例では、各ユーザーが名前とメールアドレスを持つことを必須としていますが、住所や電話番号を提供しないことは気にしません。

スキーマ
{ "type": "object", "properties": { "name": { "type": "string" }, "email": { "type": "string" }, "address": { "type": "string" }, "telephone": { "type": "string" } }, "required": ["name", "email"]}
データ
{ "name": "ウィリアム・シェイクスピア", "email": "[email protected]"}
スキーマに準拠

スキーマで定義されていないプロパティを含め、追加のプロパティを提供しても問題ありません。

データ
{ "name": "ウィリアム・シェイクスピア", "email": "[email protected]", "address": "ヘンリー・ストリート、ストラトフォード=アポン=エイボン、ウォリックシャー、イングランド", "authorship": "疑わしい"}
スキーマに準拠

必須の「email」プロパティが欠落しているため、JSONドキュメントは無効です。

データ
{ "name": "ウィリアム・シェイクスピア", "address": "ヘンリー・ストリート、ストラトフォード=アポン=エイボン、ウォリックシャー、イングランド",}
スキーマに準拠していません

JSONでは、値がnullのプロパティは、プロパティが存在しないことと同等ではありません。これは、nullが「string」型ではなく、「null」型であるために失敗します。

データ
{ "name": "ウィリアム・シェイクスピア", "address": "ヘンリー・ストリート、ストラトフォード=アポン=エイボン、ウォリックシャー、イングランド", "email": null}
スキーマに準拠していません

プロパティ名

ドラフト6で新機能

プロパティの名前は、その値に関係なく、スキーマに対して検証できます。これは、特定のプロパティを強制したくないが、それらのプロパティの名前が特定の規則に従っていることを確認したい場合に役立ちます。たとえば、すべての名前が特定のプログラミング言語で属性として使用できるように、有効なASCIIトークンであることを強制したい場合があります。

スキーマ
{ "type": "object", "propertyNames": { "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" }}
データ
{ "_a_proper_token_001": "value"}
スキーマに準拠
データ
{ "001 invalid": "value"}
スキーマに準拠していません

オブジェクトのキーは常に文字列である必要があるため、propertyNames に与えられるスキーマは、少なくとも常に次のようであることが暗示されます。

スキーマ
{ "type": "string" }

サイズ

オブジェクトのプロパティ数は、minProperties および maxProperties キーワードを使用して制限できます。これらの各キーワードは、負でない整数である必要があります。

スキーマ
{ "type": "object", "minProperties": 2, "maxProperties": 3}
データ
{}
スキーマに準拠していません
データ
{ "a": 0 }
スキーマに準拠していません
データ
{ "a": 0, "b": 1 }
スキーマに準拠
データ
{ "a": 0, "b": 1, "c": 2 }
スキーマに準拠
データ
{ "a": 0, "b": 1, "c": 2, "d": 3 }
スキーマに準拠していません

ヘルプが必要ですか?

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

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

JSON Schemaでは、ドキュメントへの貢献を他のあらゆる種類の貢献と同じくらい高く評価しています!

まだヘルプが必要ですか?

JSON Schemaを学ぶのはしばしば混乱を招きますが、ご安心ください。私たちがお手伝いします!