インターネットドラフト JSONスキーマ検証 2022年6月
ライト他 2022年12月18日失効 [ページ]
ワークグループ
インターネット技術特別調査委員会
インターネットドラフト
draft-bhutton-json-schema-validation-01
公開
意図するステータス
情報提供
失効
著者
A. ライト,
H. アンドリュース,
B. ハットン,
ポストマン

JSONスキーマ検証:JSONの構造検証のための語彙

概要

JSONスキーマ(application/schema+json)にはいくつかの目的がありますが、その1つがJSONインスタンス検証です。このドキュメントでは、JSONドキュメントの意味を記述し、JSONデータを操作するユーザーインターフェイスのヒントを提供し、有効なドキュメントがどのようなものかをアサートするためのJSONスキーマの語彙を規定します。

読者への注意

このドラフトの課題リストは、https://github.com/json-schema-org/json-schema-spec/issuesにあります。

追加情報については、https://json-schema.dokyumento.jp/を参照してください。

フィードバックを提供するには、この課題追跡ツール、ホームページにリストされているコミュニケーション方法、またはドキュメントエディタにメールを使用してください。

このメモのステータス

このインターネットドラフトは、BCP 78およびBCP 79の規定に完全に準拠して提出されています。

インターネットドラフトは、インターネット技術特別調査委員会(IETF)の作業文書です。他のグループも、作業文書をインターネットドラフトとして配布する場合があることに注意してください。現在のインターネットドラフトのリストは、https://datatracker.ietf.org/drafts/current/にあります。

インターネットドラフトは、最大6か月間有効なドラフト文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。インターネットドラフトを参考資料として使用したり、「作業中」以外で引用したりすることは不適切です。

このインターネットドラフトは、2022年12月18日に失効します。

目次

1. はじめに

JSONスキーマは、特定のJSONドキュメント(インスタンス)が一定数の基準を満たすことを要求するために使用できます。これらの基準は、この仕様で説明されているキーワードを使用して表明されます。さらに、インタラクティブなユーザーインターフェイスのインスタンス生成を支援するためのキーワードのセットも定義されています。

この仕様では、JSONスキーマコア [json-schema]仕様で定義されている概念、構文、および用語を使用します。

2. 表記規則と用語

このドキュメントにおけるキーワード "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", および "OPTIONAL" は、RFC 2119 [RFC2119] で記述されているように解釈されるべきです。

この仕様では、「コンテナインスタンス」という用語を配列とオブジェクトの両方のインスタンスを指すために使用します。「子インスタンス」という用語は、配列要素またはオブジェクトメンバー値を指すために使用します。

配列値の要素は、この配列の2つの要素が等しくない [json-schema] 場合、一意であると言われます。

3. 概要

JSON Schemaの検証は、インスタンスデータの構造に関する制約を表明します。表明されたすべての制約を満たすインスタンスの場所には、記述的なメタデータや使用上のヒントなど、アサーション以外の情報を含むキーワードがアノテーションされます。インスタンス内のすべての場所が表明されたすべての制約を満たす場合、そのインスタンスはスキーマに対して有効であると言われます。

各スキーマオブジェクトは、それが適用される各インスタンスの場所に対して個別に評価されます。これにより、バリデーターがドキュメント全体の検証プロセス全体で状態を維持する必要がないことが保証され、バリデーターの実装要件が大幅に簡素化されます。

この仕様では、一連のアサーションキーワードと、JSONインスタンスに有用な情報をアノテーションするために使用できるメタデータキーワードの小さな語彙を定義します。セクション7のキーワードは、主にアノテーションとして意図されていますが、オプションでアサーションとして使用することもできます。セクション8のキーワードは、JSON文字列として埋め込まれたドキュメントを扱うためのアノテーションです。

4. 相互運用性に関する考慮事項

4.1. 文字列インスタンスの検証

ヌル文字(\u0000)はJSON文字列で有効であることに注意してください。検証するインスタンスには、基礎となるプログラミング言語がそのようなデータを処理できるかどうかにかかわらず、この文字を含む文字列値が含まれている場合があります。

4.2. 数値インスタンスの検証

JSON仕様では任意の精度を持つ数値が許可されており、JSON Schemaはそのような境界を追加しません。これは、JSON Schemaで処理される数値インスタンスが、基礎となるプログラミング言語がそのようなデータを処理できるかどうかにかかわらず、任意に大きく、または任意に長い小数部を持つことができることを意味します。

4.3. 正規表現

正規表現を使用するキーワード、またはインスタンス値を正規表現に制約するキーワードは、JSON Schema Core [json-schema] 仕様の正規表現に関する相互運用性の考慮事項に従う必要があります。

5. メタスキーマ

デフォルトのJSON Schema方言メタスキーマの現在のURIは、https://json-schema.dokyumento.jp/draft/2020-12/schemaです。スキーマ作成者の便宜のために、このメタスキーマは、この仕様とJSON Schema Core仕様で定義されたすべての語彙と、移行期間のために予約されている2つの以前のキーワードで構成される方言を記述しています。個々の語彙および語彙メタスキーマのURIは、以下の各セクションで示されています。特定の語彙はオプションでサポートされており、関連するセクションで詳細に説明されています。

エラーを修正するために、仕様ドラフト間で更新された語彙およびメタスキーマのURIが公開される場合があります。実装では、この仕様ドラフト以降、次の仕様ドラフトまでの日付のURIは、ここにリストされているものと同じ構文とセマンティクスを示すものと見なすべきです。

6. 構造検証のための語彙

スキーマの検証キーワードは、インスタンスの検証が成功するための要件を課します。これらのキーワードはすべて、アノテーション動作のないアサーションです。

"$vocabulary"を使用しないメタスキーマは、そのURIがtrueの値で存在するかのように、この語彙を必要とすると見なされるべきです。

検証語彙として知られるこの語彙の現在のURIは、<https://json-schema.dokyumento.jp/draft/2020-12/vocab/validation>です。

対応するメタスキーマの現在のURIは、https://json-schema.dokyumento.jp/draft/2020-12/meta/validationです。

6.1. 任意のインスタンス型に対する検証キーワード

6.1.1. type

このキーワードの値は、文字列または配列のいずれかでなければなりません。配列の場合、配列の要素は文字列でなければならず、一意でなければなりません。

文字列の値は、6つのプリミティブ型("null"、"boolean"、"object"、"array"、"number"、または"string")のいずれか、またはゼロの小数部を持つ任意の数値に一致する"integer"のいずれかでなければなりません。

"type"の値が文字列の場合、インスタンスは、その型が文字列の値で表される型と一致する場合に、正常に検証されます。"type"の値が配列の場合、インスタンスは、その型が配列内の文字列で示される型のいずれかと一致する場合に、正常に検証されます。

6.1.2. enum

このキーワードの値は、配列でなければなりません。この配列は、少なくとも1つの要素を持つべきです。配列内の要素は一意であるべきです。

インスタンスは、その値がこのキーワードの配列値の要素の1つと等しい場合に、このキーワードに対して正常に検証されます。

配列内の要素は、nullを含む任意の型である可能性があります。

6.1.3. const

このキーワードの値は、nullを含む任意の型である可能性があります。

このキーワードの使用は、単一の値を持つ"enum" (セクション 6.1.2) と機能的に同等です。

インスタンスは、その値がキーワードの値と等しい場合に、このキーワードに対して正常に検証されます。

6.2. 数値インスタンス(numberとinteger)の検証キーワード

6.2.1. multipleOf

"multipleOf"の値は、0より厳密に大きい数値でなければなりません。

数値インスタンスは、このキーワードの値で除算した結果が整数になる場合にのみ有効です。

6.2.2. maximum

"maximum"の値は、数値インスタンスの包括的な上限を表す数値でなければなりません。

インスタンスが数値の場合、このキーワードは、インスタンスが"maximum"以下の場合にのみ検証されます。

6.2.3. exclusiveMaximum

"exclusiveMaximum"の値は、数値インスタンスの排他的な上限を表す数値でなければなりません。

インスタンスが数値の場合、インスタンスは、"exclusiveMaximum"よりも厳密に小さい(等しくない)値を持つ場合にのみ有効です。

6.2.4. minimum

"minimum"の値は、数値インスタンスの包括的な下限を表す数値でなければなりません。

インスタンスが数値の場合、このキーワードは、インスタンスが"minimum"以上の場合にのみ検証されます。

6.2.5. exclusiveMinimum

"exclusiveMinimum"の値は、数値インスタンスの排他的な下限を表す数値でなければなりません。

インスタンスが数値の場合、インスタンスは、"exclusiveMinimum"よりも厳密に大きい(等しくない)値を持つ場合にのみ有効です。

6.3. 文字列の検証キーワード

6.3.1. maxLength

このキーワードの値は、非負の整数でなければなりません。

文字列インスタンスは、その長さがこのキーワードの値以下の場合、このキーワードに対して有効です。

文字列インスタンスの長さは、RFC 8259 [RFC8259] で定義されている文字数として定義されます。

6.3.2. minLength

このキーワードの値は、非負の整数でなければなりません。

文字列インスタンスは、その長さがこのキーワードの値以上の場合、このキーワードに対して有効です。

文字列インスタンスの長さは、RFC 8259 [RFC8259] で定義されている文字数として定義されます。

このキーワードを省略すると、値が0の場合と同じ動作になります。

6.3.3. pattern

このキーワードの値は文字列でなければなりません。この文字列は、ECMA-262の正規表現の方言に従って、有効な正規表現であるべきです。

文字列インスタンスは、正規表現がインスタンスと正常に一致した場合に有効とみなされます。正規表現は暗黙的に固定されていないことに注意してください。

6.4. 配列の検証キーワード

6.4.1. maxItems

このキーワードの値は、非負の整数でなければなりません。

配列インスタンスは、そのサイズがこのキーワードの値以下の場合に、"maxItems" に対して有効です。

6.4.2. minItems

このキーワードの値は、非負の整数でなければなりません。

配列インスタンスは、そのサイズがこのキーワードの値以上の場合に、"minItems" に対して有効です。

このキーワードを省略した場合、値が0の場合と同じ動作になります。

6.4.3. uniqueItems

このキーワードの値は、ブール値でなければなりません。

このキーワードがブール値のfalseの場合、インスタンスは正常に検証されます。ブール値のtrueの場合、インスタンスのすべての要素が一意であれば、インスタンスは正常に検証されます。

このキーワードを省略した場合、値がfalseの場合と同じ動作になります。

6.4.4. maxContains

このキーワードの値は、非負の整数でなければなりません。

"contains" が同じスキーマオブジェクト内に存在しない場合、このキーワードは効果がありません。

インスタンス配列は、隣接する"contains" [json-schema] キーワードのアノテーション結果の形式に応じて、2つの方法で "maxContains" に対して有効です。1つ目の方法は、アノテーション結果が配列で、その配列の長さが "maxContains" の値以下の場合です。2つ目の方法は、アノテーション結果がブール値の "true" で、インスタンス配列の長さが "maxContains" の値以下の場合です。

6.4.5. minContains

このキーワードの値は、非負の整数でなければなりません。

"contains" が同じスキーマオブジェクト内に存在しない場合、このキーワードは効果がありません。

インスタンス配列は、隣接する"contains" [json-schema] キーワードのアノテーション結果の形式に応じて、2つの方法で "minContains" に対して有効です。1つ目の方法は、アノテーション結果が配列で、その配列の長さが "minContains" の値以上の場合です。2つ目の方法は、アノテーション結果がブール値の "true" で、インスタンス配列の長さが "minContains" の値以上の場合です。

値0は許可されますが、0から "maxContains" の値までの出現範囲を設定する場合にのみ有用です。値0を指定すると、"minContains" と "contains" は常に検証に合格します(ただし、"maxContains" キーワードに対しては検証に失敗する可能性があります)。

このキーワードを省略した場合、値が1の場合と同じ動作になります。

6.5. オブジェクトの検証キーワード

6.5.1. maxProperties

このキーワードの値は、非負の整数でなければなりません。

オブジェクトインスタンスは、そのプロパティの数がこのキーワードの値以下の場合に、"maxProperties" に対して有効です。

6.5.2. minProperties

このキーワードの値は、非負の整数でなければなりません。

オブジェクトインスタンスは、そのプロパティの数がこのキーワードの値以上の場合に、"minProperties" に対して有効です。

このキーワードを省略した場合、値が0の場合と同じ動作になります。

6.5.3. required

このキーワードの値は、配列でなければなりません。この配列の要素(もしあれば)は文字列でなければならず、一意でなければなりません。

オブジェクトインスタンスは、配列内のすべての項目がインスタンス内のプロパティの名前である場合に、このキーワードに対して有効です。

このキーワードを省略した場合、空の配列と同じ動作になります。

6.5.4. dependentRequired

このキーワードの値は、オブジェクトでなければなりません。このオブジェクト内のプロパティ(もしあれば)は、配列でなければなりません。各配列内の要素(もしあれば)は文字列でなければならず、一意でなければなりません。

このキーワードは、特定の他のプロパティが存在する場合に必須となるプロパティを指定します。それらの要件は、他のプロパティの存在に依存します。

インスタンスとこのキーワードの値の両方に名前として現れる名前ごとに、対応する配列内のすべての項目もインスタンス内のプロパティの名前である場合、検証は成功します。

このキーワードを省略した場合、空のオブジェクトと同じ動作になります。

7. "format" を使用したセマンティックコンテンツの語彙

7.1. 序文

構造検証だけでは、アプリケーションが特定の値を正しく利用するのに不十分な場合があります。"format" アノテーションキーワードは、スキーマ作成者が、RFCまたはその他の外部仕様である権威あるリソースによって正確に記述された、固定された値のサブセットに対してセマンティック情報を伝達できるように定義されています。

このキーワードの値は、フォーマット属性と呼ばれます。それは文字列でなければなりません。フォーマット属性は、一般に特定のインスタンス型のセットのみを検証できます。検証するインスタンスの型がこのセットに含まれていない場合、このフォーマット属性とインスタンスの検証は成功するはずです。このセクションで定義されているすべてのフォーマット属性は文字列に適用されますが、フォーマット属性はコアJSONスキーマ [json-schema]で定義されているデータモデルで定義された任意のインスタンス型に適用されるように指定できます。 この仕様の "type" キーワードは、データモデルの一部ではない "integer" 型を定義していることに注意してください。したがって、フォーマット属性は数値に制限できますが、特に整数に制限することはできません。ただし、数値フォーマットは "integer" の値を持つ "type" キーワードと一緒に使用するか、数値が整数でない場合は常に合格するように明示的に定義することができ、本質的に整数にのみ適用する場合と同じ動作になります。

この語彙の現在のURI(Format-Annotation語彙として知られています)は、<https://json-schema.dokyumento.jp/draft/2020-12/vocab/format-annotation>です。対応するメタスキーマの現在のURIは、https://json-schema.dokyumento.jp/draft/2020-12/meta/format-annotationです。この語彙のサポートの実装は必須です。

Format-Annotation語彙に加えて、カスタムメタスキーマで使用できる、"format" をアサーションとして定義する二次語彙も利用できます。Format-Assertion語彙のURIは、<https://json-schema.dokyumento.jp/draft/2020-12/vocab/format-assertion>です。対応するメタスキーマの現在のURIは、https://json-schema.dokyumento.jp/draft/2020-12/meta/format-assertionです。Format-Assertion語彙のサポートの実装は任意です。

Format-Annotation語彙とFormat-Assertion語彙の両方を指定することは、要件がFormat-Annotation語彙のスーパーセットであるため、Format-Assertion語彙のみを指定することと機能的に同等です。

7.2. 実装要件

"format" キーワードは、参照されている語彙で定義されているように機能します。

7.2.1. Format-Annotation語彙

実装がアノテーション収集をサポートしている場合、フォーマットの値はアノテーションとして収集する必要があります。これにより、スキーマ検証が利用できない、または不十分な場合に、アプリケーションレベルの検証が可能になります。

実装は、"format" をアノテーションに加えてアサーションとして扱い、指定されたセマンティクスに対する値の適合性を検証することを試みることができます。実装は、そのような評価を有効および無効にするオプションを提供する必要があり、デフォルトでは無効にする必要があります。実装は、そのような検証のサポートレベルを文書化する必要があります。 実装でFormat-Annotation語彙を指定して検証を有効にすることは、実装がFormat-Assertion語彙が指定されていない場合に完全な検証サポートを提供する必要がないため、Format-Assertion語彙を指定することと同等と見なすべきではありません。

実装がアサーション動作に構成されている場合、それは:

  • 以下で定義される各フォーマット属性に対して、実装固有の最善の検証を提供する必要があります。
  • 任意のまたはすべてのフォーマット属性の検証を、常にtrueの検証結果を生成することにより、noopとして実装することを選択できます。

これは、実装における現在の実態、すなわち、一部またはすべてのフォーマット属性について、検証レベルが大きく異なり、まったく検証を行わないものも存在することに合致しています。また、アノテーションの動作のみに依存し、アプリケーションでセマンティック検証を行うことを推奨するベストプラクティスを奨励するように設計されています。

7.2.2. フォーマットアサーション語彙

Format-Assertion語彙がtrueの値で宣言されている場合、実装は、この仕様で定義されているすべてのフォーマットに対して完全な検証サポートを提供しなければなりません(MUST)。完全な検証サポートを提供できない実装は、スキーマの処理を拒否しなければなりません(MUST)。

Format-Assertion語彙をサポートする実装は、以下を行う必要があります。

  • 実装がアノテーション収集をサポートする場合、「format」をアノテーションとして収集しなければなりません(MUST)。
  • 「format」をアサーションとして評価しなければなりません(MUST)。
  • この仕様で定義されているすべてのフォーマット属性、および認識する追加のフォーマット属性について、正しい型のインスタンス値が存在し、検証に失敗するような構文検証を実装しなければなりません(MUST)。

フォーマット属性の最小限の検証要件は、多くの属性で複雑さが伴うため、意図的に曖昧かつ許可的に定められています。特に、要件は構文チェックに限定されていることに注意してください。実装がメールを送信したり、URLに接続を試みたり、フォーマットインスタンスによって識別されるエンティティの存在をチェックしたりすることは期待されていません。 日時などの単純なフォーマットの場合、構文検証は徹底的であることが期待されます。メールアドレスなど、さまざまな規格の統合であり、時間が経つにつれて無数の調整が加えられてきた複雑なフォーマットの場合、曖昧なルールや廃止されたルールがあり、値を使用する他のアプリケーションによって制限されている場合もあれば、そうでない場合もあり、最小限の検証で十分です。たとえば、「@」を含まないインスタンス文字列は明らかに有効なメールアドレスではなく、7ビットASCII以外の文字を含む「email」や「hostname」も同様に明らかに無効です。

実装は、各フォーマットに共通の解析ライブラリ、またはよく知られた正規表現を使用することを推奨します(RECOMMENDED)。実装は、各フォーマット属性がどのように、どの程度検証されるかを明確に文書化すべきです(SHOULD)。

標準コアおよび検証メタスキーマセクション5には、この語彙が"$vocabulary"キーワードにfalseの値で含まれています。これは、デフォルトでは、実装はこのキーワードをアサーションとしてサポートする必要がないためです。trueの値でフォーマット語彙をサポートすることは、コードサイズを大幅に増加させ、場合によっては実行時間を増加させることが理解されており、すべての実装に適しているわけではありません。

7.2.3. カスタムフォーマット属性

実装は、カスタムフォーマット属性をサポートしてもよい(MAY)。当事者間の合意がない限り、スキーマ作成者は、ピア実装がそのようなカスタムフォーマット属性をサポートすることを期待してはなりません(SHALL NOT)。実装は、不明なフォーマットをアノテーションとして収集することを失敗してはなりません(MUST NOT)。Format-Assertion語彙が指定されている場合、実装は不明なフォーマットに遭遇した場合に失敗しなければなりません(MUST)。

語彙は、キーワードに対して異なる値セットを具体的に宣言することをサポートしていません。この制限、およびこのキーワードの過去の実装のばらつきにより、相互運用性が必要な場合は、追加のフォーマット属性ではなく、カスタム語彙で追加のキーワードを定義することが推奨されます(RECOMMENDED)。

7.3. 定義されたフォーマット

7.3.1. 日付、時刻、および期間

これらの属性は、文字列インスタンスに適用されます。

日付と時刻のフォーマット名は、RFC 3339、セクション5.6[RFC3339]から派生しています。期間フォーマットは、RFC 3339の付録Aに示されているISO 8601 ABNFからのものです。

フォーマットをサポートする実装は、次の属性のサポートを実装すべきです(SHOULD)。

date-time
文字列インスタンスは、上記で参照した「date-time」ABNFルールに従って有効な表現である場合、この属性に対して有効です。
date
文字列インスタンスは、上記で参照した「full-date」ABNFルールに従って有効な表現である場合、この属性に対して有効です。
time
文字列インスタンスは、上記で参照した「full-time」ABNFルールに従って有効な表現である場合、この属性に対して有効です。
duration
文字列インスタンスは、上記で参照した「duration」ABNFルールに従って有効な表現である場合、この属性に対して有効です。

実装は、そのRFCで定義されている他のフォーマット名を使用して追加の属性をサポートしてもよい(MAY)。「full-date」または「full-time」が実装されている場合、対応する短縮形(それぞれ「date」または「time」)を実装する必要があり(MUST)、同じように動作する必要があります。実装は、そのフォーマットのルールに従って検証しない限り、RFC 3339フォーマットに一致する名前で拡張属性を定義すべきではありません(SHOULD NOT)。 すべてのRFC 3339フォーマットのサポートの必要性については現在コンセンサスがないため、この名前空間を予約する方法は、セット全体にコミットすることなく実験を促します。フォーマット実装の要件が一般的に柔軟になるか、これらが完全に指定された属性に昇格するか、または削除される可能性が高いかのいずれかになります。

7.3.2. メールアドレス

これらの属性は、文字列インスタンスに適用されます。

文字列インスタンスは、次のように、有効なインターネットメールアドレスである場合、これらの属性に対して有効です。

email
RFC 5321、セクション4.1.2[RFC5321]の「Mailbox」ABNFルールで定義されています。
idn-email
RFC 6531、セクション3.3[RFC6531]の拡張された「Mailbox」ABNFルールで定義されています。

「email」属性に対して有効なすべての文字列は、「idn-email」属性に対しても有効であることに注意してください。

7.3.3. ホスト名

これらの属性は、文字列インスタンスに適用されます。

文字列インスタンスは、次のように、インターネットホスト名の有効な表現である場合、これらの属性に対して有効です。

hostname
RFC 1123、セクション2.1[RFC1123]で定義されており、RFC 5891、セクション4.4[RFC5891]で指定されたPunycodeアルゴリズムを使用して生成されたホスト名を含みます。
idn-hostname
hostnameと同じようにRFC 1123で定義されているか、RFC 5890、セクション2.3.2.3[RFC5890]で定義されている国際化ホスト名で定義されています。

「hostname」属性に対して有効なすべての文字列は、「idn-hostname」属性に対しても有効であることに注意してください。

7.3.4. IPアドレス

これらの属性は、文字列インスタンスに適用されます。

文字列インスタンスは、次のように、IPアドレスの有効な表現である場合、これらの属性に対して有効です。

ipv4
RFC 2673、セクション3.2[RFC2673]で定義されている「dotted-quad」ABNF構文に従ったIPv4アドレス。
ipv6
RFC 4291、セクション2.2[RFC4291]で定義されているIPv6アドレス。

7.3.5. リソース識別子

これらの属性は、文字列インスタンスに適用されます。

uri
文字列インスタンスは、[RFC3986]に従って、有効なURIである場合、この属性に対して有効です。
uri-reference
文字列インスタンスは、[RFC3986]に従って、有効なURI参照(URIまたは相対参照)である場合、この属性に対して有効です。
iri
文字列インスタンスは、[RFC3987]に従って、有効なIRIである場合、この属性に対して有効です。
iri-reference
文字列インスタンスは、[RFC3987]に従って、有効なIRI参照(IRIまたは相対参照)である場合、この属性に対して有効です。
uuid
文字列インスタンスは、[RFC4122]に従って、UUIDの有効な文字列表現である場合、この属性に対して有効です。

有効なURIはすべて有効なIRIであり、有効なURI参照はすべて有効なIRI参照であることに注意してください。

また、「uuid」フォーマットは、URN内のUUIDではなく、プレーンUUID用であることにも注意してください。例は「f81d4fae-7dec-11d0-a765-00a0c91e6bf6」です。URNとしてのUUIDの場合は、「uri」フォーマットを使用し、URIスキームとURN名前空間を示すための「^urn:uuid:」の「pattern」正規表現を使用します。

7.3.6. uri-template

この属性は、文字列インスタンスに適用されます。

文字列インスタンスは、[RFC6570]に従って、有効なURIテンプレート(任意のレベル)である場合、この属性に対して有効です。

URIテンプレートはIRIに使用できることに注意してください。IRIテンプレートの個別の仕様はありません。

7.3.7. JSONポインター

これらの属性は、文字列インスタンスに適用されます。

json-pointer
文字列インスタンスがこの属性に対して有効なのは、RFC 6901 のセクション 5 [RFC6901] に従って、それがJSONポインターの有効なJSON文字列表現である場合です。
relative-json-pointer
文字列インスタンスがこの属性に対して有効なのは、それが有効な相対JSONポインター [relative-json-pointer]である場合です。

絶対JSONポインターと相対JSONポインターの両方を許可するには、"anyOf" または "oneOf" を使用して、いずれかの形式のサポートを示す必要があります。

7.3.8. regex

この属性は、文字列インスタンスに適用されます。

正規表現。ECMA-262 [ecma262] の正規表現方言に従って有効であるべきです。

フォーマットを検証する実装は、この仕様の正規表現 (セクション 4.3) セクションで定義されている ECMA-262 の少なくともサブセットを受け入れる必要があり(MUST)、すべての有効な ECMA-262 式を受け入れるべきです(SHOULD)。

8. 文字列エンコードデータのコンテンツのための語彙

8.1. 前書き

このセクションで定義されたアノテーションは、インスタンスにJSON文字列でエンコードされた非JSONデータが含まれていることを示します。

これらのプロパティは、JSONデータをリッチマルチメディアドキュメントとして解釈するために必要な追加情報を提供します。それらは、コンテンツのタイプ、エンコード方法、および/または検証方法を記述します。それらは検証アサーションとして機能しません。不正な形式の文字列エンコードされたドキュメントによって、包含するインスタンスが無効と見なされてはなりません(MUST NOT)。

「$vocabulary」を使用しないメタスキーマは、そのURIがtrueの値で存在するかのように、この語彙を必要とすると見なされるべきです(SHOULD)。

この語彙の現在のURI(コンテンツ語彙として知られています)は、<https://json-schema.dokyumento.jp/draft/2020-12/vocab/content>です。

対応するメタスキーマの現在のURIは、https://json-schema.dokyumento.jp/draft/2020-12/meta/contentです。

8.2. 実装要件

セキュリティとパフォーマンスに関する懸念、および可能性のあるコンテンツタイプのオープンエンドな性質のため、実装はデフォルトでは文字列コンテンツを自動的にデコード、解析、および/または検証してはなりません(MUST NOT)。これにより、包含ドキュメントを処理したコンシューマーとは異なるコンシューマーによる処理を目的とした埋め込みドキュメントのユースケースもサポートされます。

このセクションのすべてのキーワードは文字列にのみ適用され、他のデータ型には影響しません。

実装は、文字列コンテンツを自動的にデコード、解析、および/または検証する機能を提供してもよい(MAY)。ただし、デフォルトではこれらの操作を実行してはならず(MUST NOT)、各文字列エンコードされたドキュメントの検証結果を、囲むドキュメントとは別に提供する必要があります(MUST)。このプロセスは、インスタンスを元のスキーマに対して完全に評価し、その後にアノテーションを使用して各文字列エンコードされたドキュメントをデコード、解析、および/または検証するのと同等であるべきです(SHOULD)。今のところ、このような自動デコード、解析、検証機能から解析されたデータおよび/または検証結果を実行および返す正確なメカニズムは、仕様化されていません。このような機能が普及した場合、将来のドラフトでより詳細に仕様化される可能性があります。

これらのキーワードに従ってインスタンス文字列を自動的に処理することによって導入される可能性のある脆弱性については、セキュリティに関する考慮事項 (セクション 10) セクションも参照してください。

8.3. contentEncoding

インスタンス値が文字列の場合、このプロパティは、文字列がエンコードされたバイナリデータとして解釈されるべきであり、このプロパティで指定されたエンコーディングを使用してデコードされるべきであることを定義します。

いくつかのバリエーションを持つbase16、32、および64エンコーディングを示す可能な値は、RFC 4648 [RFC4648] にリストされています。さらに、RFC 2045 [RFC2045] のセクション 6.7 および 6.8 は、MIMEで使用されるエンコーディングを提供します。このキーワードは、バイナリデータをASCII文字にマッピングするように設計されたMIMEのContent-Transfer-Encodingヘッダーに由来します。これは、HTTPリクエストとレスポンスのコンテンツをエンコード(例:圧縮または暗号化)するために使用されるHTTPのContent-Encodingヘッダーとは関係ありません。

「base64」は両方のRFCで定義されているため、文字列がMIMEコンテキストでの使用を特に意図していない限り、RFC 4648からの定義を想定する必要があります(SHOULD)。これらのエンコーディングはすべて、7ビットASCII文字のみで構成される文字列になることに注意してください。したがって、このキーワードは、その範囲外の文字を含む文字列には意味がありません。

このキーワードが存在しないが、「contentMediaType」が存在する場合、これはエンコーディングが同一エンコーディングであることを示し、つまり、コンテンツをUTF-8文字列で表すために変換は不要であったことを意味します。

このプロパティの値は文字列である必要があります(MUST)。

8.4. contentMediaType

インスタンスが文字列の場合、このプロパティは文字列の内容のメディアタイプを示します。「contentEncoding」が存在する場合、このプロパティはデコードされた文字列を記述します。

このプロパティの値は文字列である必要があり(MUST)、RFC 2046 [RFC2046] で定義されているメディアタイプである必要があります(MUST)。

8.5. contentSchema

インスタンスが文字列で、「contentMediaType」が存在する場合、このプロパティには文字列の構造を記述するスキーマが含まれます。

このキーワードは、JSONスキーマのデータモデルにマッピングできる任意のメディアタイプで使用できます(MAY)。

このプロパティの値は有効なJSONスキーマである必要があります(MUST)。「contentMediaType」が存在しない場合は無視されるべきです(SHOULD)。

8.6.

これは、「contentEncoding」と「contentMediaType」の使用例を示すスキーマ例です。

{
    "type": "string",
    "contentEncoding": "base64",
    "contentMediaType": "image/png"
}

このスキーマで記述されたインスタンスは文字列であると予想され、それらの値はbase64エンコードされたPNG画像として解釈できる必要があります。

別の例:

{
    "type": "string",
    "contentMediaType": "text/html"
}

このスキーマで記述されたインスタンスは、JSON文字列がデコードされた文字セットを使用して、HTMLを含む文字列であると予想されます。RFC 8259 [RFC8259] のセクション 8.1 によると、完全に閉じたシステムの外では、これはUTF-8である必要があります(MUST)。

この例では、HMAC SHA-256アルゴリズムを使用してMACされたJWTを記述し、そのクレームセットに「iss」フィールドと「exp」フィールドが必要です。

{
    "type": "string",
    "contentMediaType": "application/jwt",
    "contentSchema": {
        "type": "array",
        "minItems": 2,
        "prefixItems": [
            {
                "const": {
                    "typ": "JWT",
                    "alg": "HS256"
                }
            },
            {
                "type": "object",
                "required": ["iss", "exp"],
                "properties": {
                    "iss": {"type": "string"},
                    "exp": {"type": "integer"}
                }
            }
        ]
    }
}

「contentEncoding」が表示されていないことに注意してください。「application/jwt」メディアタイプはbase64urlエンコーディングを使用していますが、それはメディアタイプによって定義されており、JWT文字列を2つのJSONデータ構造のリスト(最初にヘッダー、次にペイロード)にデコードする方法を決定します。JWTメディアタイプはJWTがJSON文字列で表現できることを保証するため、それ以上のエンコードまたはデコードは必要ありません。

9. 基本的なメタデータアノテーションのための語彙

これらの汎用アノテーションキーワードは、ドキュメントおよびユーザーインターフェイスの表示目的に関して、一般的に使用される情報を提供します。それらは、包括的な機能セットを形成することを意図していません。むしろ、より複雑なアノテーションベースのアプリケーションのために、追加の語彙を定義できます。

「$vocabulary」を使用しないメタスキーマは、そのURIがtrueの値で存在するかのように、この語彙を必要とすると見なされるべきです(SHOULD)。

この語彙の現在のURI(メタデータ語彙として知られています)は、<https://json-schema.dokyumento.jp/draft/2020-12/vocab/meta-data>です。

対応するメタスキーマの現在のURIは、https://json-schema.dokyumento.jp/draft/2020-12/meta/meta-dataです。

9.1. "title" および "description"

これらのキーワードの値は両方とも文字列である必要があります(MUST)。

これらのキーワードは両方とも、このユーザーインターフェイスによって生成されたデータに関する情報でユーザーインターフェイスを装飾するために使用できます。タイトルは短くすることが推奨され、説明はこのスキーマで記述されたインスタンスの目的について説明します。

9.2. "default"

このキーワードの値に制限はありません。このキーワードの複数の出現箇所が単一のサブインスタンスに適用される場合、実装は重複を削除する必要があります(SHOULD)。

このキーワードは、特定のスキーマに関連付けられたデフォルトのJSON値を提供するために使用できます。デフォルト値は、関連付けられたスキーマに対して有効であることが推奨されます(RECOMMENDED)。

9.3. "deprecated"

このキーワードの値はブール値である必要があります(MUST)。このキーワードの複数の出現箇所が単一のサブインスタンスに適用される場合、アプリケーションは、いずれかの出現箇所がtrue値を指定した場合、インスタンスの場所が非推奨であると見なす必要があります(SHOULD)。

「deprecated」が真(boolean true)の値を持つ場合、それはアプリケーションが宣言されたプロパティの使用を控えるべきであることを示します。そのプロパティが将来削除される可能性があることを意味する場合があります。

「deprecated」が真の値を持つルートスキーマは、記述されているリソース全体が将来削除される可能性があることを示します。

「deprecated」キーワードは、そのキーワードを含むスキーマオブジェクトが適用される各インスタンスの場所に適用されます。これにより、含まれる配列やオブジェクトが非推奨でなくても、すべての配列項目やオブジェクトプロパティが非推奨になるシナリオが発生する可能性があります。

このキーワードを省略した場合、値がfalseの場合と同じ動作になります。

9.4. 「readOnly」と「writeOnly」

これらのキーワードの値はブール値(boolean)でなければなりません。これらのキーワードの複数の出現が単一のサブインスタンスに適用される場合、結果の動作は、いずれかの出現箇所が真値を指定している場合は真値と同様になり、それ以外の場合は偽値と同様になるべきです。

「readOnly」が真(boolean true)の値を持つ場合、インスタンスの値は所有権限によって排他的に管理され、アプリケーションがこのプロパティの値を変更しようとする試みは、その所有権限によって無視または拒否されることが予想されることを示します。

ドキュメント全体で「readOnly」とマークされたインスタンスドキュメントは、所有権限に送信された場合、無視されるか、または権限の裁量でエラーになる可能性があります。

「writeOnly」が真(boolean true)の値を持つ場合、インスタンスが所有権限から取得される際にはその値が存在しないことを示します。ドキュメント(またはそれが表すリソース)を更新または作成するために所有権限に送信される場合には存在できますが、インスタンスの更新または新規作成されたバージョンには含まれません。

ドキュメント全体で「writeOnly」とマークされたインスタンスドキュメントは、ある種の空白ドキュメントとして返されるか、取得時にエラーが発生するか、または取得リクエストが権限の裁量で無視される可能性があります。

たとえば、「readOnly」はデータベースで生成されたシリアル番号を読み取り専用としてマークするために使用され、「writeOnly」はパスワード入力フィールドをマークするために使用されます。

これらのキーワードは、ユーザーインターフェースインスタンスの生成を支援するために使用できます。特に、アプリケーションは、書き込み専用フィールドに入力された値を入力時に隠すウィジェットを使用することを選択できます。

これらのキーワードを省略すると、値がfalseの場合と同じ動作になります。

9.5. 「examples」

このキーワードの値は配列でなければなりません。配列内の値には制限はありません。このキーワードの複数の出現が単一のサブインスタンスに適用される場合、実装は配列の配列ではなく、すべての値のフラット配列を提供する必要があります。

このキーワードは、使用例を示す目的で、特定のスキーマに関連付けられたサンプルJSON値を提供するために使用できます。これらの値は、関連付けられたスキーマに対して有効であることが推奨されます。

実装は、「default」の値が存在する場合は、追加の例として使用してもかまいません。「examples」がない場合でも、「default」はこのように使用できます。

10. セキュリティに関する考慮事項

JSON Schemaの検証は、JSON Schemaコアのボキャブラリを定義し、そこにリストされているすべてのセキュリティに関する考慮事項に関係します。

JSON Schemaの検証では、正規表現の使用が許可されています。正規表現には、多数の異なる(しばしば互換性のない)実装があります。一部の実装では、任意のコードの埋め込みが許可されていますが、これはJSON Schemaの範囲外であり、許可されるべきではありません。正規表現は、計算に非常にコストがかかるように(いわゆる「壊滅的なバックトラッキング」で)作成することもでき、サービス拒否攻撃につながる可能性があります。

「contentEncoding」または「contentMediaType」に基づいてインスタンスの文字列データを検証または評価することをサポートする実装は、誤解を招く情報に基づいて安全でない方法でデータを評価するリスクがあります。アプリケーションは、スキーマとインスタンス間の関係が確立されている場合(例:同じ権限を共有している場合)にのみ、このような処理を実行することにより、このリスクを軽減できます。

メディアタイプまたはエンコーディングの処理は、そのメディアタイプまたはエンコーディングのセキュリティに関する考慮事項の対象となります。たとえば、JSON文字列内にエンコードされたJavaScriptまたはECMAScriptを処理する場合、RFC 4329 スクリプトメディアタイプ [RFC4329]のセキュリティに関する考慮事項が適用されます。

11. 参考文献

11.1. 規範的参考文献

[RFC2119]
Bradner, S., "RFCにおける要求レベルを示すためのキーワード", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC1123]
Braden, R., 編., "インターネットホストの要件 - アプリケーションとサポート", STD 3, RFC 1123, DOI 10.17487/RFC1123, , <https://www.rfc-editor.org/info/rfc1123>.
[RFC2045]
Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part One: インターネットメッセージ本体の形式", RFC 2045, DOI 10.17487/RFC2045, , <https://www.rfc-editor.org/info/rfc2045>.
[RFC2046]
Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part Two: メディアタイプ", RFC 2046, DOI 10.17487/RFC2046, , <https://www.rfc-editor.org/info/rfc2046>.
[RFC2673]
Crawford, M., "ドメインネームシステムにおけるバイナリラベル", RFC 2673, DOI 10.17487/RFC2673, , <https://www.rfc-editor.org/info/rfc2673>.
[RFC3339]
Klyne, G. and C. Newman, "インターネット上での日付と時刻:タイムスタンプ", RFC 3339, DOI 10.17487/RFC3339, , <https://www.rfc-editor.org/info/rfc3339>.
[RFC3986]
Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): 一般的な構文", STD 66, RFC 3986, DOI 10.17487/RFC3986, , <https://www.rfc-editor.org/info/rfc3986>.
[RFC3987]
Duerst, M. and M. Suignard, "国際化されたリソース識別子(IRI)", RFC 3987, DOI 10.17487/RFC3987, , <https://www.rfc-editor.org/info/rfc3987>.
[RFC4122]
Leach, P., Mealling, M., and R. Salz, "普遍的に一意な識別子(UUID)URN名前空間", RFC 4122, DOI 10.17487/RFC4122, , <https://www.rfc-editor.org/info/rfc4122>.
[RFC4291]
Hinden, R. and S. Deering, "IPバージョン6のアドレスアーキテクチャ", RFC 4291, DOI 10.17487/RFC4291, , <https://www.rfc-editor.org/info/rfc4291>.
[RFC4648]
Josefsson, S., "Base16、Base32、およびBase64データエンコーディング", RFC 4648, DOI 10.17487/RFC4648, , <https://www.rfc-editor.org/info/rfc4648>.
[RFC5321]
Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, DOI 10.17487/RFC5321, , <https://www.rfc-editor.org/info/rfc5321>.
[RFC5890]
Klensin, J., "アプリケーション向けの国際化ドメイン名(IDNA):定義とドキュメントフレームワーク", RFC 5890, DOI 10.17487/RFC5890, , <https://www.rfc-editor.org/info/rfc5890>.
[RFC5891]
Klensin, J., "アプリケーションにおける国際化ドメイン名(IDNA):プロトコル", RFC 5891, DOI 10.17487/RFC5891, , <https://www.rfc-editor.org/info/rfc5891>.
[RFC6570]
Gregorio, J., Fielding, R., Hadley, M., Nottingham, M., and D. Orchard, "URIテンプレート", RFC 6570, DOI 10.17487/RFC6570, , <https://www.rfc-editor.org/info/rfc6570>.
[RFC6531]
Yao, J. and W. Mao, "国際化されたメールのSMTP拡張", RFC 6531, DOI 10.17487/RFC6531, , <https://www.rfc-editor.org/info/rfc6531>.
[RFC6901]
Bryan, P., 編., Zyp, K., and M. Nottingham, 編., "JavaScript Object Notation(JSON)ポインター", RFC 6901, DOI 10.17487/RFC6901, , <https://www.rfc-editor.org/info/rfc6901>.
[RFC8259]
Bray, T., 編., "JavaScript Object Notation(JSON)データ交換フォーマット", STD 90, RFC 8259, DOI 10.17487/RFC8259, , <https://www.rfc-editor.org/info/rfc8259>.
[ecma262]
"ECMA-262、第11版仕様", , <https://262.ecma-international.org/5.1/>.
[relative-json-pointer]
Luff, G., Andrews, H., および B. Hutton, 編, "Relative JSON Pointers", 作業中, Internet-Draft, draft-handrews-relative-json-pointer-01, , <https://datatracker.ietf.org/doc/html/draft-handrews-relative-json-pointer-01>.
[json-schema]
Wright, A., Andrews, H., Hutton, B., および G. Dennis, "JSON Schema: A Media Type for Describing JSON Documents", 作業中, Internet-Draft, draft-bhutton-json-schema-01, , <https://datatracker.ietf.org/doc/html/draft-bhutton-json-schema-01>.

11.2. 参考情報

[RFC4329]
Hoehrmann, B., "Scripting Media Types", RFC 4329, DOI 10.17487/RFC4329, , <https://www.rfc-editor.org/info/rfc4329>.

付録 A. バリデーションからコアに移動したキーワード

このドラフトでは、いくつかのキーワードがこのドキュメントからコア仕様 [json-schema]に移動されました。一部は名前の変更やその他の変更を伴っています。これは、以下の以前のバリデーションキーワードに影響を与えます:

"definitions"
"$ref" と一致するように、またタイプ入力が短くなるように "$defs" に名前が変更されました。スキーマ語彙の作成者は、古い名前を使用しているスキーマを無効にしないように、異なる動作をする "definitions" キーワードを定義すべきではありません。"definitions" は、このドキュメントで参照されている単一語彙メタスキーマには存在しませんが、デフォルトのメタスキーマには残っており、実装では、そのメタスキーマが使用されている場合、"$defs" と "definitions" が同じ動作をすると想定する必要があります。
"allOf", "anyOf", "oneOf", "not", "if", "then", "else", "items", "additionalItems", "contains", "propertyNames", "properties", "patternProperties", "additionalProperties"
これらのキーワードはすべて、サブスキーマをインスタンスに適用し、独自に条件を主張することなく、その結果を結合します。アサーションキーワードがない場合、これらのアプライケーターは、false のブールスキーマを使用するか、true のブールスキーマ(または同等のスキーマオブジェクト)の結果を反転させることによってのみ、アサーションの失敗を引き起こす可能性があります。このため、バリデーション、ハイパースキーマ、および拡張語彙のすべてが基づくことができる汎用的なメカニズムとして定義する方が適切です。
"dependencies"
このキーワードには2つの異なる動作モードがあり、実装や推論が比較的困難でした。スキーマ形式はコアに移動され、アプライケーター語彙の一部として "dependentSchemas" に名前が変更されました。これは、サブスキーマをプロパティ値に適用する代わりに、プロパティを含むオブジェクトに適用する点を除いて、"properties" に類似しています。プロパティ名配列形式はここに保持され、"dependentRequired" に名前が変更されました。これは、"required" アサーションキーワードの条件付き使用のショートカットであるアサーションであるためです。

付録 B. 謝辞

JSON Schemaの初期ドラフトに取り組んでくれたGary Court、Francis Galiegue、Kris Zyp、Geraint Luffに感謝します。

ドキュメントへの提出とパッチを提供してくれたJason Desrosiers、Daniel Perrett、Erik Wilde、Evgeny Poberezkin、Brad Bowman、Gowry Sankar、Donald Pipowitch、Dave Finlay、Denis Laxalde、Phil Sturgeon、Shawn Silverman、Karen Etheridgeに感謝します。

付録 C. 変更履歴

このセクションは、Internet-Draftステータスを離れる前に削除される予定です。

draft-bhutton-json-schema-validation-01
  • "minContains" キーワードの説明を改善し、明確化する
  • "production" の使用を廃止し、代わりに "ABNF rule" を使用する
draft-bhutton-json-schema-validation-00
  • メール形式のRFC参照を5322ではなく5321に修正する
  • "contentEncoding" 値のセットと意味を明確にする
  • 正規表現サポートのためにECMA-262の第11版を参照する
  • "format" をアノテーションのみの語彙とアサーション語彙に分割する
  • 配列に適用可能な場合の "deprecated" を明確にする
draft-handrews-json-schema-validation-02
  • キーワードを正式な語彙にグループ化する
  • 語彙の観点から "format" の実装要件を更新する
  • デフォルトでは、検証を有効にできるものの、"format" は検証してはならない
  • 語彙宣言を使用して "format" の検証を要求することができる
  • "definitions" を "$defs" としてコア仕様に移動する
  • アプライケーターキーワードをコア仕様に移動する
  • "dependencies" の配列形式を "dependentRequired" に名前変更し、スキーマ形式をコア仕様に移動する
  • すべて "content*" キーワードをアサーションではなくアノテーションとして指定する
  • 文字列エンコードされたドキュメントにスキーマを適用できるように "contentSchema" を追加する
  • "contentEncoding" で RFC 4648 エンコーディングも許可する
  • "minContains" および "maxContains" を追加する
  • "hostname" および "idn-hostname" の RFC 参照を更新する
  • "uuid" および "duration" 形式を追加する
draft-handrews-json-schema-validation-01
  • このドラフトは純粋に明確化であり、機能的な変更はない
  • "not" や同様のケースでアノテーションを無視する背後にある一般的な原則を提供する
  • "if"/"then"/"else" バリデーションの相互作用を明確にする
  • アノテーションに対する "if"/"then"/"else" の動作を明確にする
  • 軽微な書式設定および相互参照の改善
draft-handrews-json-schema-validation-00
  • "if"/"then"/"else" を追加する
  • キーワードをコア仕様に従ってアサーションまたはアノテーションとして分類する
  • 将来的に "dependencies" を削除する可能性があることを警告する
  • 読みやすくするために、バリデーションキーワードをサブセクションにグループ化する
  • "readOnly" をハイパースキーマからバリデーションメタデータに移動する
  • "writeOnly" を追加する
  • 以前のハイパースキーマ "media" キーワードを使用して、文字列エンコードされたメディアセクションを追加する
  • "regex" 形式を復元する(削除は意図的ではなかった)
  • "date" および "time" 形式を追加し、追加の RFC 3339 形式名を予約する
  • I18N形式: "iri", "iri-reference", "idn-hostname", "idn-email"
  • "json-pointer" 形式がURIフラグメントではなく文字列エンコーディングを意味することを明確にする
  • "minimum" および "exclusiveMinimum" の意味を反転させたタイポを修正する
  • 形式構文の参照を規範的参照に移動する
  • JSONは規範的な要件である
draft-wright-json-schema-validation-01
  • 完全な単語を使用したハイフン付きの形式名で標準化する("uriref" が "uri-reference" になる)
  • 形式 "uri-template" および "json-pointer" を追加する
  • "exclusiveMaximum"/"exclusiveMinimum" を "maximum"/"minimum" のブール修飾子から独立した数値フィールドに変更する。
  • additionalItems/items を2つのセクションに分割する
  • properties/patternProperties/additionalProperties の定義を修正する
  • "examples" キーワードを追加する
  • "contains" キーワードを追加する
  • 空の "required" および "dependencies" 配列を許可する
  • "type" の参照をプリミティブ型に修正する
  • "const" キーワードを追加する
  • "propertyNames" キーワードを追加する
draft-wright-json-schema-validation-00
  • 追加のセキュリティに関する考慮事項を追加する
  • "最新バージョン" メタスキーマへの参照を削除し、代わりに番号付きバージョンを使用する
  • 多くのキーワード定義を簡潔にするために言い換える
  • 相対URI参照も許可する "uriref" 形式を追加する
draft-fge-json-schema-validation-00
  • 最初のドラフト。
  • ドラフトv3から救出された。
  • "required" キーワードを再定義する。
  • "extends"、"disallow" を削除する
  • "anyOf"、"allOf"、"oneOf"、"not"、"definitions"、"minProperties"、"maxProperties" を追加する。
  • "dependencies" メンバーの値は単一の文字列ではなくなった。プロパティ依存配列には少なくとも1つの要素が必要。
  • "divisibleBy" の名前を "multipleOf" に変更する。
  • "type" 配列にスキーマを含めることはできなくなった。可能な値として "any" を削除する。
  • "format" セクションを修正する。サポートをオプションにする。
  • "format": 属性 "phone"、"style"、"color" を削除する。"ip-address" の名前を "ipv4" に変更する。すべての属性の参照を追加する。
  • 配列/オブジェクトインスタンスのスキーマを計算するアルゴリズムを提供する。
  • 相互運用性に関する考慮事項を追加する。

著者のアドレス

Austin Wright (編集者)
Henry Andrews (編集者)
Ben Hutton (編集者)
ポストマン