インターネットエンジニアリングタスクフォース | fge. Galiegue, Ed. |
インターネットドラフト | |
ステータス:情報提供 | K. Zyp |
期限:2017年8月26日 | SitePen (USA) |
G. Court | |
2013 |
JSONスキーマ:対話型および非対話型検証
draft-fge-json-schema-validation-00
JSONスキーマ(application/schema+json)にはいくつかの目的があり、その1つはインスタンス検証です。検証プロセスは対話型または非対話型です。たとえば、アプリケーションはJSONスキーマを使用して、ユーザー入力チェックに加えて、対話型のコンテンツ生成を可能にするユーザーインターフェイスを構築したり、さまざまなソースから取得したデータを検証したりできます。この仕様では、検証を目的としたスキーマキーワードについて説明します。
このインターネットドラフトは、BCP 78およびBCP 79の規定に完全に準拠して提出されています。
インターネットドラフトは、インターネットエンジニアリングタスクフォース(IETF)の作業文書です。他のグループもインターネットドラフトとして作業文書を配布する場合があることに注意してください。現在のインターネットドラフトのリストはhttp://datatracker.ietf.org/drafts/current/にあります。
インターネットドラフトは、最大6か月間有効なドラフト文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。インターネットドラフトを参照資料として使用したり、「進行中の作業」として以外の方法で引用したりすることは不適切です。
このインターネットドラフトは、2017年8月26日に期限切れになります。
Copyright (c) 2013 IETF Trust and the persons identified as the document authors. All rights reserved.
この文書は、BCP 78およびこの文書の発行日に有効なIETF文書に関するIETFトラストの法的規定(http://trustee.ietf.org/license-info)の対象となります。これらの文書は、この文書に関するあなたの権利と制限について説明しているため、注意深く確認してください。この文書から抽出されたコードコンポーネントには、トラストの法的規定のセクション4.eに記載されているSimplified BSD Licenseのテキストを含める必要があり、Simplified BSD Licenseに記載されているように保証なしで提供されます。
JSONスキーマを使用すると、特定のJSONドキュメント(インスタンス)が特定の数の基準を満たすことを要求できます。これらの基準は、この仕様で説明されている一連のキーワードによって具体化されます。さらに、対話型インスタンス生成を支援するための一連のキーワードが定義されています。これらについても、この仕様で説明します。
この仕様では、JSONスキーマコアスペックで定義されている用語を使用します。読者はこの仕様のコピーを持っていることをお勧めします。
この文書のキーワード「MUST」、「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「MAY」、および「OPTIONAL」は、RFC 2119 [RFC2119]に記載されているとおりに解釈されます。
この仕様では、配列とオブジェクトの両方のインスタンスを指すために「コンテナインスタンス」という用語を使用します。配列要素またはオブジェクトメンバー値を指すために「子インスタンス」という用語を使用します。
この仕様では、オブジェクトのメンバー名のセットを指すために「プロパティセット」という用語を使用します。たとえば、JSONオブジェクト{ "a": 1, "b": 2 }のプロパティセットは[ "a", "b" ]です。
配列値の要素は、コアスペックで定義されているように、この配列の2つの要素が等しくない場合、一意であると言われます。
ヌル文字(\x00)はJSON文字列で有効であることに注意してください。検証するインスタンスには、基盤となるプログラミング言語がそのようなデータを処理できるかどうかに関係なく、この文字を含む文字列値が含まれている場合があります。
JSONの仕様では、数値のスケールまたは精度の境界を定義していません。JSONスキーマもそのような境界を定義していません。これは、JSONスキーマによって処理される数値インスタンスが、基盤となるプログラミング言語がそのようなデータを処理できるかどうかに関係なく、任意に大きく、かつ/または任意に大きな小数部を持つことができることを意味します。
2つの検証キーワード「pattern」と「patternProperties」は、制約を表現するために正規表現を使用します。これらの正規表現は、ECMA 262 [ecma262]正規表現の方言に従って有効であるべきです(SHOULD)。
さらに、正規表現の構成要素のサポートには大きなばらつきがあるため、スキーマの作成者は、次の正規表現トークンに限定する必要があります(SHOULD)。
最後に、実装では、正規表現が先頭にも末尾にもアンカーされていないと見なしてはなりません(MUST NOT)。これは、たとえば、「es」が「expression」と一致することを意味します。
一部の検証キーワードは、1つ以上のプリミティブ型にのみ適用されます。インスタンスのプリミティブ型が特定のキーワードで検証できない場合、このキーワードとインスタンスの検証は成功する必要があります(SHOULD)。
この仕様では、キーワードを検証するプリミティブ型(または型)に従って、キーワードを異なるセクションにグループ化します。一部のキーワードはすべてのインスタンスタイプを検証することに注意してください。
インスタンスを検証するために、一部のキーワードは他のキーワードの有無の影響を受けます。この場合、これらのキーワードはすべて同じセクションにグループ化されます。
一部のキーワードは、存在しない場合、実装によってデフォルト値を持つと見なされる場合があります(MAY)。この場合、デフォルト値が記載されます。
コンテナインスタンス(配列またはオブジェクト)を検証できるキーワードは、インスタンス自体のみを検証し、子(配列アイテムまたはオブジェクトプロパティ)は検証しません。ただし、これらのキーワードの一部には、子がどのスキーマに対して有効である必要があるかを計算するために必要な情報が含まれています。子のインスタンスの関連スキーマを計算するアルゴリズムは、別のセクションで説明します。
配列要素は1つのスキーマに対してのみ検証する必要があるのに対し、オブジェクトメンバー値は複数のスキーマに対して検証する必要がある場合があることに注意してください。
"multipleOf"の値はJSON数値である必要があります(MUST)。この数値は0より厳密に大きい必要があります(MUST)。
数値インスタンスは、インスタンスをこのキーワードの値で除算した結果が整数の場合、「multipleOf」に対して有効です。
"maximum"の値はJSON数値である必要があります(MUST)。 "exclusiveMaximum"の値はブール値である必要があります(MUST)。
「exclusiveMaximum」が存在する場合、「maximum」も存在しなければなりません(MUST)。
検証の成功は、「exclusiveMaximum」の有無とその値に依存します。
「exclusiveMaximum」が存在しない場合、ブール値がfalseで存在するとみなすことができます。
「minimum」の値はJSON数値でなければなりません(MUST)。「exclusiveMinimum」の値はブール値でなければなりません(MUST)。
「exclusiveMinimum」が存在する場合、「minimum」も存在しなければなりません(MUST)。
検証の成功は、「exclusiveMinimum」の有無とその値に依存します。
「exclusiveMinimum」が存在しない場合、ブール値がfalseで存在するとみなすことができます。
このキーワードの値は整数でなければなりません(MUST)。この整数は0以上でなければなりません(MUST)。
文字列インスタンスの長さがこのキーワードの値以下であれば、このキーワードに対して有効です。
文字列インスタンスの長さは、RFC 4627 [RFC4627]で定義されている文字数として定義されます。
このキーワードの値は整数でなければなりません(MUST)。この整数は0以上でなければなりません(MUST)。
文字列インスタンスの長さがこのキーワードの値以上であれば、このキーワードに対して有効です。
文字列インスタンスの長さは、RFC 4627 [RFC4627]で定義されている文字数として定義されます。
「minLength」が存在しない場合、整数値0で存在するとみなすことができます。
このキーワードの値は文字列でなければなりません(MUST)。この文字列は、ECMA 262正規表現の規則に従って、有効な正規表現である必要があります(SHOULD)。
正規表現がインスタンスに正常に一致する場合、文字列インスタンスは有効とみなされます。正規表現は暗黙的にアンカーされていないことを思い出してください。
「additionalItems」の値は、ブール値またはオブジェクトのいずれかでなければなりません(MUST)。オブジェクトの場合、このオブジェクトは有効なJSONスキーマでなければなりません(MUST)。
「items」の値は、オブジェクトまたは配列のいずれかでなければなりません(MUST)。オブジェクトの場合、このオブジェクトは有効なJSONスキーマでなければなりません(MUST)。配列の場合、この配列の項目はオブジェクトでなければならず(MUST)、これらの各オブジェクトは有効なJSONスキーマでなければなりません(MUST)。
これらの2つのキーワードに関する配列インスタンスの検証の成功は、次のように決定されます。
次の例は、「additionalItems」のブール値がfalseで、「items」が配列の場合を扱います。これは、インスタンスが検証に失敗する可能性のある唯一の状況であるためです。
これはスキーマの例です。
{ "items": [ {}, {}, {} ], "additionalItems": false }
このスキーマでは、次のインスタンスは有効です。
次のインスタンスは無効です。
いずれかのキーワードが存在しない場合、空のスキーマが存在するとみなすことができます。
このキーワードの値は整数でなければなりません(MUST)。この整数は0以上でなければなりません(MUST)。
配列インスタンスのサイズがこのキーワードの値以下であれば、「maxItems」に対して有効です。
このキーワードの値は整数でなければなりません(MUST)。この整数は0以上でなければなりません(MUST)。
配列インスタンスのサイズがこのキーワードの値以上であれば、「minItems」に対して有効です。
このキーワードが存在しない場合、値0で存在するとみなすことができます。
このキーワードの値はブール値でなければなりません(MUST)。
このキーワードのブール値がfalseの場合、インスタンスの検証は成功します。ブール値がtrueの場合、すべての要素が一意である場合、インスタンスの検証は成功します。
存在しない場合、このキーワードはブール値falseで存在するとみなすことができます。
このキーワードの値は整数でなければなりません(MUST)。この整数は0以上でなければなりません(MUST)。
オブジェクトインスタンスのプロパティ数がこのキーワードの値以下であれば、「maxProperties」に対して有効です。
このキーワードの値は整数でなければなりません(MUST)。この整数は0以上でなければなりません(MUST)。
オブジェクトインスタンスのプロパティ数がこのキーワードの値以上であれば、「minProperties」に対して有効です。
このキーワードが存在しない場合、値0で存在するとみなすことができます。
このキーワードの値は配列でなければなりません(MUST)。この配列には少なくとも1つの要素がなければなりません(MUST)。この配列の要素は文字列でなければならず(MUST)、一意でなければなりません(MUST)。
オブジェクトインスタンスのプロパティセットに、このキーワードの配列値のすべての要素が含まれている場合、このキーワードに対して有効です。
「additionalProperties」の値は、ブール値またはオブジェクトでなければなりません(MUST)。オブジェクトの場合、有効なJSONスキーマでもなければなりません(MUST)。
「properties」の値はオブジェクトでなければなりません(MUST)。このオブジェクトの各値はオブジェクトでなければならず(MUST)、各オブジェクトは有効なJSONスキーマでなければなりません(MUST)。
「patternProperties」の値はオブジェクトでなければなりません(MUST)。このオブジェクトの各プロパティ名は、ECMA 262正規表現の規則に従って、有効な正規表現である必要があります(SHOULD)。このオブジェクトの各プロパティ値はオブジェクトでなければならず(MUST)、各オブジェクトは有効なJSONスキーマでなければなりません(MUST)。
これらの3つのキーワードに対するオブジェクトインスタンスの検証の成功は、「additionalProperties」の値に依存します。
「properties」または「patternProperties」が存在しない場合、値として空のオブジェクトが存在するとみなすことができます。
「additionalProperties」が存在しない場合、値として空のスキーマが存在するとみなすことができます。
この場合、インスタンスの検証は「properties」と「patternProperties」のプロパティセットに依存します。このセクションでは、「patternProperties」のプロパティ名を便宜上正規表現と呼びます。
最初のステップは、次のセットを収集することです。
これらの3つのセットを収集したら、プロセスは次のとおりです。
これらの2つのステップの後、セット「s」が空の場合、インスタンスの検証は成功します。
このスキーマは例として使用されます。
{ "properties": { "p1": {} }, "patternProperties": { "p": {}, "[0-9]": {} }, "additionalProperties": false }
これは検証するインスタンスです。
{ "p1": true, "p2": null, "a32&o": "foobar", "": [], "fiddle": 42, "apple": "pie" }
3つのプロパティセットは次のとおりです。
アルゴリズムの2つのステップを適用する
セット「s」にはまだ2つの要素 "" と "fiddle" が含まれています。したがって、検証は失敗します。
このキーワードの値はオブジェクトでなければなりません(MUST)。このオブジェクトの各値は、オブジェクトまたは配列のいずれかでなければなりません(MUST)。
値がオブジェクトの場合、有効なJSONスキーマでなければなりません(MUST)。これはスキーマ依存関係と呼ばれます。
値が配列の場合、少なくとも1つの要素がなければなりません(MUST)。各要素は文字列でなければならず(MUST)、配列内の要素は一意でなければなりません(MUST)。これはプロパティ依存関係と呼ばれます。
スキーマ依存関係のすべての(名前、スキーマ)ペアについて、インスタンスにこの名前のプロパティがある場合、スキーマに対しても正常に検証する必要があります。
プロパティ名に関連付けられた値ではなく、インスタンス自体が正常に検証する必要があることに注意してください。
プロパティ依存関係の各(名前、プロパティセット)ペアについて、インスタンスにこの名前のプロパティがある場合、プロパティセットと同じ名前のプロパティも必要です。
このキーワードの値は配列でなければなりません(MUST)。この配列には少なくとも1つの要素がなければなりません(MUST)。配列内の要素は一意でなければなりません(MUST)。
配列内の要素は、nullを含む任意のタイプにすることができます。
インスタンスの値がこのキーワードの配列値のいずれかの要素と等しい場合、インスタンスはこのキーワードに対して正常に検証されます。
このキーワードの値は、文字列または配列でなければなりません(MUST)。配列の場合、配列の要素は文字列でなければならず(MUST)、一意でなければなりません(MUST)。
文字列値は、コア仕様で定義されている7つのプリミティブ型のいずれかでなければなりません(MUST)。
インスタンスのプリミティブ型が、キーワードで定義されている型のいずれかである場合、インスタンスは正常に一致とみなされます。注記:「number」には「integer」が含まれます。
このキーワードの値は配列でなければなりません(MUST)。この配列には少なくとも1つの要素がなければなりません(MUST)。
配列の要素はオブジェクトでなければなりません(MUST)。各オブジェクトは有効なJSONスキーマでなければなりません(MUST)。
インスタンスがこのキーワードの値で定義されたすべてのスキーマに対して正常に検証された場合、インスタンスはこのキーワードに対して正常に検証されます。
このキーワードの値は配列でなければなりません(MUST)。この配列には少なくとも1つの要素がなければなりません(MUST)。
配列の要素はオブジェクトでなければなりません(MUST)。各オブジェクトは有効なJSONスキーマでなければなりません(MUST)。
インスタンスがこのキーワードの値で定義された少なくとも1つのスキーマに対して正常に検証された場合、インスタンスはこのキーワードに対して正常に検証されます。
このキーワードの値は配列でなければなりません(MUST)。この配列には少なくとも1つの要素がなければなりません(MUST)。
配列の要素はオブジェクトでなければなりません(MUST)。各オブジェクトは有効なJSONスキーマでなければなりません(MUST)。
インスタンスがこのキーワードの値で定義されたちょうど1つのスキーマに対して正常に検証された場合、インスタンスはこのキーワードに対して正常に検証されます。
このキーワードの値はオブジェクトでなければなりません(MUST)。このオブジェクトは有効なJSONスキーマでなければなりません(MUST)。
このキーワードで定義されたスキーマに対して検証が失敗した場合、インスタンスはこのキーワードに対して有効です。
このキーワードの値はオブジェクトでなければなりません(MUST)。このオブジェクトの各メンバー値は、有効なJSONスキーマでなければなりません(MUST)。
このキーワードは、検証自体には直接関与しません。スキーマ作成者がJSONスキーマをより一般的なスキーマにインライン化するための標準化された場所を提供することが役割です。
{ "type": "array", "items": { "$ref": "#/definitions/positiveInteger" }, "definitions": { "positiveInteger": { "type": "integer", "minimum": 0, "exclusiveMinimum": true } } }
例として、正の整数の配列を記述するスキーマを以下に示します。ここで、正の整数の制約は「definitions」内のサブスキーマです。
これらのキーワードの値はどちらも文字列でなければなりません(MUST)。
これらのキーワードはどちらも、ユーザーインターフェースを、そのユーザーインターフェースによって生成されるデータに関する情報で装飾するために使用できます。タイトルはできれば短く、説明は、このスキーマで記述されるインスタンスの目的について説明を提供します。
これらのキーワードはどちらも、ルートスキーマおよび任意のサブスキーマで使用できます(MAY)。
このキーワードの値に制限はありません。
このキーワードは、特定のスキーマに関連付けられたデフォルトのJSON値を提供するために使用できます。デフォルト値は、関連付けられたスキーマに対して有効であることが推奨されます(RECOMMENDED)。
このキーワードは、ルートスキーマおよび任意のサブスキーマで使用できます(MAY)。
構造的検証だけでは、インスタンスがアプリケーションのすべての要件を満たしていることを検証するには不十分な場合があります。「format」キーワードは、RFCまたは他の外部仕様であれ、信頼できるリソースによって正確に記述されている値の固定サブセットに対して、相互運用可能なセマンティック検証を可能にするために定義されています。
このキーワードの値は、フォーマット属性と呼ばれます。文字列でなければなりません(MUST)。フォーマット属性は、一般に、特定のインスタンスタイプのセットのみを検証できます。検証対象のインスタンスの型がこのセットにない場合、このフォーマット属性とインスタンスの検証は成功する必要があります(SHOULD)。
実装は「format」キーワードをサポートしてもよい(MAY)。サポートする場合、
実装はカスタムフォーマット属性を追加してもよい(MAY)。当事者間の合意がない限り、スキーマ作成者は、ピア実装がこのキーワードおよび/またはカスタムフォーマット属性をサポートすることを期待してはなりません(SHALL NOT)。
この属性は文字列インスタンスに適用されます。
文字列インスタンスがRFC 3339、セクション5.6 [RFC3339]で定義されている有効な日付表現である場合、この属性に対して有効です。
この属性は文字列インスタンスに適用されます。
文字列インスタンスがRFC 5322、セクション3.4.1 [RFC5322]で定義されている有効なインターネット電子メールアドレスである場合、この属性に対して有効です。
この属性は文字列インスタンスに適用されます。
文字列インスタンスがRFC 1034、セクション3.1 [RFC1034]で定義されているインターネットホスト名の有効な表現である場合、この属性に対して有効です。
この属性は文字列インスタンスに適用されます。
文字列インスタンスがRFC 2673、セクション3.2 [RFC2673]で定義されている「ドット区切り」ABNF構文に従ってIPv4アドレスの有効な表現である場合、この属性に対して有効です。
この属性は文字列インスタンスに適用されます。
文字列インスタンスがRFC 2373、セクション2.2 [RFC2373]で定義されているIPv6アドレスの有効な表現である場合、この属性に対して有効です。
この属性は文字列インスタンスに適用されます。
文字列インスタンスが[RFC3986]に従って有効なURIである場合、この属性に対して有効です。
子インスタンスが検証する必要があるスキーマの計算は、以下の要素に影響されます。
さらに、計算に含まれる1つ以上のキーワードが定義されていない場合、それらのキーワードはデフォルト値で存在すると見なされることが重要です。デフォルト値については、このセクションで後述します。
子インスタンスの定義特性は、配列内でのインデックスです。注記: 配列のインデックスは0から始まります。
この計算に含まれる2つのキーワードは、「items」と「additionalItems」です。
いずれかのキーワードが存在しない場合、空のスキーマを値として存在すると見なされます。さらに、「additionalItems」のブール値trueは、空のスキーマと同等と見なされます。
「items」がスキーマの場合、子インスタンスはそのインデックスおよび「additionalItems」の値に関係なく、このスキーマに対して有効でなければなりません。
この場合、スキーマはインデックスに依存します。
定義特性は、子のプロパティ名です。
この計算に含まれる3つのキーワードは、「properties」、「patternProperties」、および「additionalProperties」です。
「properties」または「patternProperties」が存在しない場合、空のオブジェクトを値として存在すると見なされます。
「additionalProperties」が存在しない場合、空のスキーマを値として存在すると見なされます。さらに、ブール値trueは、空のスキーマと同等と見なされます。
以下の計算では、次の名前を使用します。
セット「p」に値「m」が含まれている場合、「properties」内の対応するスキーマが「s」に追加されます。
「pp」内の各正規表現について、「m」と正常に一致する場合、「patternProperties」内の対応するスキーマが「s」に追加されます。
この段階で「s」が空の場合にのみ、「additionalProperties」で定義されたスキーマが「s」に追加されます。
JSONスキーマ検証には、JSONスキーマコア仕様で定義されているもの以外の追加のセキュリティに関する考慮事項はありません。
この仕様は、IANAに影響を与えません。
[RFC2119] | Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, 1997年3月. |
[RFC1034] | P. モカペトリス、「ドメイン名 - 概念と機能」、STD 13、RFC 1034、DOI 10.17487/RFC1034、1987年11月。 |
[RFC2373] | R. ヒンデン、S. ディーリング、「IPバージョン6アドレス指定アーキテクチャ」、RFC 2373、DOI 10.17487/RFC2373、1998年7月。 |
[RFC2673] | M. クロウフォード、「ドメインネームシステムにおけるバイナリラベル」、RFC 2673、DOI 10.17487/RFC2673、1999年8月。 |
[RFC3339] | G. クライン、C. ニューマン、「インターネットの日付と時刻:タイムスタンプ」、RFC 3339、DOI 10.17487/RFC3339、2002年7月。 |
[RFC3986] | T. バーナーズ=リー、R. フィールディング、L. マシンター、「Uniform Resource Identifier (URI): Generic Syntax(統一資源識別子(URI):汎用構文)」、STD 66、RFC 3986、DOI 10.17487/RFC3986、2005年1月。 |
[RFC4627] | D. クロックフォード、「JavaScript Object Notation (JSON) の application/json メディアタイプ」、RFC 4627、DOI 10.17487/RFC4627、2006年7月。 |
[RFC5322] | P. レズニック、「インターネットメッセージフォーマット」、RFC 5322、DOI 10.17487/RFC5322、2008年10月。 |
[ecma262] | ECMA 262 仕様" |