リファレンス
オブジェクト
オブジェクトはJSONにおけるマッピング型です。オブジェクトは「キー」を「値」にマッピングします。JSONでは、「キー」は常に文字列でなければなりません。これらのペアのそれぞれは、慣例的に「プロパティ」と呼ばれます。
Pythonでは、「オブジェクト」はdict
型に類似しています。ただし、重要な違いとして、Pythonの辞書ではキーとしてハッシュ可能なものなら何でも使用できますが、JSONではすべてのキーが文字列でなければなりません。
ここでの「オブジェクト」という単語の2つの用法に混乱しないようにしてください。Pythonは、すべてに対する汎用的な基底クラスを意味するためにobject
という単語を使用しますが、JSONでは文字列キーから値へのマッピングを意味するためのみに使用されます。
JSONでは文字列以外をキーとして使用することは無効です。
プロパティ
オブジェクトのプロパティ(キーと値のペア)は、properties
キーワードを使って定義します。properties
の値はオブジェクトであり、各キーはプロパティの名前、各値はそのプロパティを検証するために使用されるスキーマです。properties
キーワードのプロパティ名と一致しないプロパティは、このキーワードによって無視されます。
properties
のプロパティ名と一致しないプロパティを許可しない方法については、追加プロパティおよび評価されないプロパティを参照してください。
例えば、番号、通りの名前、通りの種類で構成される住所のシンプルなスキーマを定義したいとします。
// 型が間違った数値が提供された場合、それは無効です。
デフォルトでは、プロパティを省略することは有効です。「必須プロパティ」を参照してください。
拡張として、空のオブジェクトでさえ有効です
デフォルトでは、追加のプロパティを提供することは有効です
パターンプロパティ
特定の種類のプロパティ名が与えられた場合、値が特定のスキーマに一致する必要があるということを言いたい場合があります。それがpatternProperties
の出番です。これは正規表現をスキーマにマッピングします。プロパティ名が指定された正規表現に一致する場合、プロパティ値は対応するスキーマに対して検証される必要があります。
正規表現はアンカーされていません。これは、patternProperties
の正規表現を定義する場合、式がプロパティ名のどこにでも一致する可能性があることに注意することが重要であることを意味します。たとえば、正規表現"p"
は、"apple"
のように、p
を含む任意のプロパティ名と一致します。名前が単に"p"
であるプロパティだけではありません。したがって、通常は、正規表現を^...$
で囲む方がわかりやすいです。たとえば、"^p$"
。
この例では、名前がプレフィックスS_
で始まるプロパティはすべて文字列である必要があり、プレフィックスI_
で始まるプロパティはすべて整数である必要があります。どちらの正規表現にも一致しないプロパティはすべて無視されます。
名前が S_
で始まる場合、それは文字列でなければなりません。
名前が I_
で始まる場合、それは整数でなければなりません。
これは、どの正規表現にも一致しないキーです。
追加のプロパティ
additionalProperties
キーワードは、properties
キーワードにリストされていない名前や、patternProperties
キーワードの正規表現に一致しないプロパティなど、追加のものを処理する方法を制御するために使用されます。デフォルトでは、追加のプロパティはすべて許可されます。
additionalProperties
キーワードの値は、インスタンス内で、properties
または patternProperties
に一致しないプロパティを検証するために使用されるスキーマです。additionalProperties
スキーマを false
に設定すると、追加のプロパティは許可されなくなります。
プロパティの例を再利用しますが、今回は additionalProperties
を false
に設定します。
additionalProperties
が false
であるため、この余分なプロパティ "direction" はオブジェクトを無効にします。
インスタンスの追加プロパティに対して、より複雑な制約を課すために、ブール値以外のスキーマを使用できます。たとえば、追加プロパティを許可するが、それらの値がそれぞれ文字列である場合に限る、ということが可能です。
これは、追加プロパティの値が文字列であるため、有効です。
これは、追加プロパティの値が文字列ではないため、無効です。
additionalProperties
は、properties
および patternProperties
と組み合わせて使用できます。以下の例では、patternProperties の例に基づいて、数値でなければならない "builtin"
プロパティを追加し、(properties
で定義されておらず、patternProperties
で一致しない) 追加のすべてのプロパティは文字列でなければならないと宣言します。
これは、どの正規表現にも一致しないキーです。
文字列である必要があります。
クローズドスキーマの拡張
additionalProperties
は、それ自身と同じサブスキーマで宣言されたプロパティのみを認識することに注意することが重要です。したがって、additionalProperties
は、組み合わせキーワード(allOfなど)を使用してスキーマを「拡張」することを制限する可能性があります。次の例では、additionalProperties
が、住所スキーマの例を拡張しようとする試行を失敗させる可能性があることを確認できます。
"properties": { "type": { "enum": [ "residential", "business" ] } }, "required": ["type"]}
additionalProperties
が失敗します。「type」は追加とみなされます。
required
に失敗しました。「type」は必須です。
additionalProperties
は、同じサブスキーマで宣言されたプロパティのみを認識するため、「street_address」、「city」、「state」以外のものはすべて追加プロパティと見なします。allOf でスキーマを組み合わせても、それは変わりません。使用できる回避策は、additionalProperties
を拡張スキーマに移動し、拡張スキーマのプロパティを再宣言することです。
"properties": { "street_address": true, "city": true, "state": true, "type": { "enum": [ "residential", "business" ] } }, "required": ["type"], "additionalProperties": false}
さて、additionalProperties
キーワードは、必要なプロパティをすべて認識し、スキーマが期待どおりに動作するようになりました。 unevaluatedProperties
キーワードが、プロパティを再宣言する必要なくこの問題をどのように解決するかについて、読み進めてください。
評価されていないプロパティ
前のセクションでは、結合を使用してスキーマを「拡張」する際のadditionalProperties
の使用における課題について説明しました。unevaluatedProperties
キーワードは、サブスキーマで宣言されたプロパティを認識できるという点を除いて、additionalProperties
に似ています。したがって、前のセクションの例は、プロパティを再宣言する必要なく書き直すことができます。
"properties": { "type": { "enum": ["residential", "business"] } }, "required": ["type"], "unevaluatedProperties": false}
unevaluatedProperties
は、スキーマを処理する際に正常に検証されたプロパティを収集し、それらを許可されたプロパティのリストとして使用することで機能します。これにより、条件付きでプロパティを追加するなどの、より複雑な処理が可能になります。次の例では、アドレスの「タイプ」が「ビジネス」の場合にのみ、「department」プロパティを許可します。
"if": { "type": "object", "properties": { "type": { "const": "business" } }, "required": ["type"] }, "then": { "properties": { "department": { "type": "string" } } },
"unevaluatedProperties": false}
このスキーマでは、then
スキーマで宣言されたプロパティは、アドレスの "type" が "business" の場合にのみ「評価済み」プロパティとしてカウントされます。
必須プロパティ
デフォルトでは、properties
キーワードで定義されたプロパティは必須ではありません。ただし、required
キーワードを使用して、必須プロパティのリストを提供できます。
required
キーワードは、ゼロ個以上の文字列の配列を受け取ります。これらの文字列はそれぞれ一意である必要があります。
required
は少なくとも1つの文字列を含む必要があります。次のユーザーレコードを定義するスキーマの例では、各ユーザーが名前とメールアドレスを持つことを必須としていますが、住所や電話番号を提供しないことは気にしません。
スキーマで定義されていないプロパティを含め、追加のプロパティを提供しても問題ありません。
必須の「email」プロパティが欠落しているため、JSONドキュメントは無効です。
JSONでは、値がnull
のプロパティは、プロパティが存在しないことと同等ではありません。これは、null
が「string」型ではなく、「null」型であるために失敗します。
プロパティ名
プロパティの名前は、その値に関係なく、スキーマに対して検証できます。これは、特定のプロパティを強制したくないが、それらのプロパティの名前が特定の規則に従っていることを確認したい場合に役立ちます。たとえば、すべての名前が特定のプログラミング言語で属性として使用できるように、有効なASCIIトークンであることを強制したい場合があります。
オブジェクトのキーは常に文字列である必要があるため、propertyNames
に与えられるスキーマは、少なくとも常に次のようであることが暗示されます。
サイズ
オブジェクトのプロパティ数は、minProperties
および maxProperties
キーワードを使用して制限できます。これらの各キーワードは、負でない整数である必要があります。
ヘルプが必要ですか?
これらのドキュメントはお役に立ちましたか?
ドキュメントをより良くするためにご協力ください!
JSON Schemaでは、ドキュメントへの貢献を他のあらゆる種類の貢献と同じくらい高く評価しています!