はじめに
初めてのスキーマの作成
JSON Schemaは、JSONドキュメントに注釈を付けたり、検証したりするために使用できるボキャブラリーです。このチュートリアルでは、JSON Schemaを作成するプロセスを説明します。
JSON Schemaを作成した後、選択した言語のバリデーターを使用して、スキーマに対してサンプルデータを検証できます。ツールにアクセスして、ニーズに合ったバリデーターを選択してください。
JSON Schemaの作成方法をすでに理解しており、スキーマ生成、コード生成、ドキュメント、UI生成、JSON Schema処理または変換など、さまざまなJSON Schemaユースケースを探している場合は、ツールにアクセスして、JSON Schemaエコシステムで利用可能な素晴らしいツールをご確認ください。
概要
このガイドで使用されている例は、次のようなJSONオブジェクトを使用してデータを格納する製品カタログです。
カタログ内の各製品には、以下の情報が含まれています。
productId: 製品の識別子productName: 製品名price: 消費者への価格tags: 識別タグのオプションの配列
JSONオブジェクトは人間が読解可能ですが、コンテキストやメタデータは含まれていません。オブジェクトを見ても、キーの意味や入力可能な値が何であるかを判断することはできません。JSON Schemaは、これらの疑問に対する回答を提供するための標準です。このガイドでは、JSONデータの構造、制約、およびデータ型を記述するJSON Schemaドキュメントを作成します。
JSON Schema入門
インスタンスは検証または記述されるJSONドキュメントであり、スキーマは記述を含むドキュメントです。
最も基本的なスキーマは空のJSONオブジェクトです。これは何も制約せず、すべてを許可し、何も記述しません。
スキーマに検証キーワードを追加することで、インスタンスに制約を適用できます。たとえば、typeキーワードを使用して、インスタンスをオブジェクト、配列、文字列、数値、ブール値、またはnullに制約できます。
JSON Schemaはハイパーメディアに対応しており、既存のJSONベースのHTTP APIに注釈を付けるのに最適です。JSON SchemaドキュメントはURIによって識別されます。URIは、HTTPリンクヘッダーおよびJSON Schemaドキュメント内で使用して、再帰的な定義を可能にします。
スキーマ定義の作成
基本的なスキーマ定義を作成するには、次のキーワードを定義します。
$schema: スキーマが準拠するJSON Schema標準のドラフトを指定します。$id: スキーマのURIを設定します。この一意のURIを使用して、同じドキュメント内または外部JSONドキュメントからスキーマの要素を参照できます。titleおよびdescription: スキーマの意図を記述します。これらのキーワードは、検証されるデータに制約を追加しません。type: JSONデータの最初の制約を定義します。以下の製品カタログの例では、このキーワードはデータがJSONオブジェクトでなければならないことを指定しています。
例えば
キーワードはJSONキーを使用して定義されます。通常、検証されるデータはJSONデータドキュメントに含まれていますが、JSON Schemaは、テキストファイルやXMLファイルなど、他のコンテンツタイプに含まれるJSONデータも検証できます。
JSON Schemaの用語では、$schemaと$idはスキーマキーワード、titleとdescriptionはスキーマアノテーション、そしてtypeはバリデーションキーワードです。
プロパティを定義する
このセクションでは、propertiesキーワードを追加します。JSON Schemaの用語では、propertiesはバリデーションキーワードです。propertiesを定義すると、バリデーション対象のJSONデータの各キーを表すプロパティを持つオブジェクトを作成します。また、オブジェクトで定義されたどのプロパティが必須であるかを指定することもできます。
propertiesオブジェクトを追加する
製品カタログの例を使用すると、productIdは製品を一意に識別する数値です。これは製品の正式な識別子であるため、必須です。
スキーマにpropertiesオブジェクトを追加するには
スキーマの末尾に
propertiesバリデーションキーワードを追加します1 ... 2 "title": "Product", 3 "description": "A product from Acme's catalog", 4 "type": "object", 5 "properties": { 6 "productId": {} 7 }以下のスキーマアノテーションと共に、
productIdキーワードを追加しますdescription:productIdが何であるかを説明します。この場合、製品の一意の識別子です。type: 期待されるデータの種類を定義します。この例では、製品識別子は数値であるため、integerを使用します。1... 2 "properties": { 3 "productId": { 4 "description": "The unique identifier for a product", 5 "type": "integer" 6 } 7 }
新しいpropertiesバリデーションキーワードを使用すると、スキーマ全体は次のようになります
次の例では、別の必須キーであるproductNameを追加します。この値は文字列です。
properties オブジェクトには、productId と productName の2つのキーが含まれています。JSONデータがこのスキーマに対して検証されると、これらのフィールドのいずれかに無効なデータが含まれているドキュメントは検証に失敗します。
必須プロパティの定義
このセクションでは、特定のプロパティを必須にする方法について説明します。この例では、既存の2つのキーを必須にし、price という名前の別の必須キーを追加します。price キーには、他のキーと同様に description と type がありますが、最小値も指定されています。ストアには無料のものはないため、各製品には0を超える価格値が必要です。exclusiveMinimum 検証キーワードを使用してこれを定義します。
必須プロパティを定義するには
propertiesオブジェクトの中に、priceキーを追加します。通常のスキーマアノテーションであるdescriptionとtypeを含め、typeは数値にします。1 "properties": { 2 ... 3 "price": { 4 "description": "The price of the product", 5 "type": "number" 6 } 7 }exclusiveMinimum検証キーワードを追加し、値をゼロに設定します。1 "price": { 2 "description": "The price of the product", 3 "type": "number", 4 "exclusiveMinimum": 0 5 }required検証キーワードを、スキーマの末尾、propertiesオブジェクトの後に追加します。配列にproductID、productName、そして新しいpriceキーを追加します。1 ... 2 "properties": { 3 ... 4 "price": { 5 "description": "The price of the product", 6 "type": "number", 7 "exclusiveMinimum": 0 8 }, 9 }, 10 "required": [ "productId", "productName", "price" ]
新しい required キーワードと price キーを追加した後のスキーマ全体は、以下のようになります。
exclusiveMinimum 検証キーワードはゼロに設定されているため、ゼロより大きい値のみが有効とみなされます。ゼロを有効なオプションとして含めるには、代わりに minimum 検証キーワードを使用することができます。
オプションのプロパティを定義する
このセクションでは、オプションのプロパティを定義する方法について説明します。この例では、以下の基準を使用して tags という名前のキーワードを定義します。
tagsキーワードはオプションです。tagsが含まれる場合、少なくとも1つのアイテムが含まれている必要があります。- すべてのタグは一意である必要があります。
- すべてのタグはテキストである必要があります。
オプションのプロパティを定義するには
propertiesオブジェクトの中に、tagsキーワードを追加します。通常のスキーマアノテーションであるdescriptionとtypeを含め、typeを配列として定義します。1 ... 2 "properties": { 3 ... 4 "tags": { 5 "description": "Tags for the product", 6 "type": "array" 7 } 8 }配列に何が表示されるかを定義するために、
itemsの新しい検証キーワードを追加します。たとえば、stringです。1 ... 2 "tags": { 3 "description": "Tags for the product", 4 "type": "array", 5 "items": { 6 "type": "string" 7 } 8 }配列に少なくとも1つのアイテムがあることを確認するには、
minItems検証キーワードを使用します。1 ... 2 "tags": { 3 "description": "Tags for the product", 4 "type": "array", 5 "items": { 6 "type": "string" 7 }, 8 "minItems": 1 9 }配列内のすべてのアイテムが一意であることを確認するには、
uniqueItems検証キーワードを使用し、それをtrueに設定します。1 ... 2 "tags": { 3 "description": "Tags for the product", 4 "type": "array", 5 "items": { 6 "type": "string" 7 }, 8 "minItems": 1, 9 "uniqueItems": true 10 }
新しい tags キーワードを追加した後のスキーマ全体は、以下のようになります。
新しいキーワードは必須ではないため、required セクションには変更がありません。
ネストされたデータ構造を作成する
これまでの例では、1つのレベルのみを持つフラットなスキーマについて説明しました。このセクションでは、JSONスキーマでネストされたデータ構造を使用する方法について説明します。
ネストされたデータ構造を作成するには
propertiesオブジェクトの中に、dimensionsという名前の新しいキーを作成します。1 ... 2 "properties": { 3 ... 4 "dimensions": {} 5 }type検証キーワードをobjectとして定義します。1 ... 2 "dimensions": { 3 "type": "object" 4 }ネストされたデータ構造を格納するために、
properties検証キーワードを追加します。新しいpropertiesキーワードの中に、すべてnumberタイプを使用するlength、width、heightのキーワードを追加します。1 ... 2 "dimensions": { 3 "type": "object", 4 "properties": { 5 "length": { 6 "type": "number" 7 }, 8 "width": { 9 "type": "number" 10 }, 11 "height": { 12 "type": "number" 13 } 14 } 15 }これらの各プロパティを必須にするには、
dimensionsオブジェクトの中にrequired検証キーワードを追加します。1 ... 2 "dimensions": { 3 "type": "object", 4 "properties": { 5 "length": { 6 "type": "number" 7 }, 8 "width": { 9 "type": "number" 10 }, 11 "height": { 12 "type": "number" 13 } 14 }, 15 "required": [ "length", "width", "height" ] 16 }
新しいネストされたデータ構造を使用したスキーマ全体は、以下のようになります。
新しい required 検証キーワードは、dimensions キーのスコープ内でのみ適用されます。
外部参照を追加する
このセクションでは、スキーマの外部にあるリソースを参照する方法について説明します。多くのデータ構造でスキーマを共有することは、スキーマを使いやすく、読みやすく、最新の状態に保つための一般的な方法です。これまでのところ、製品カタログスキーマは自己完結型です。このセクションでは、新しいスキーマを作成し、それを製品カタログスキーマで参照します。
以下のスキーマは、地理的な場所を検証します。
このスキーマを製品カタログスキーマで参照するには
propertiesオブジェクトの中に、warehouseLocationという名前のキーを追加します。1 ... 2 "properties": { 3 ... 4 "warehouseLocation": {} 5 }外部の地理的位置スキーマにリンクするには、
$refスキーマキーワードとスキーマURLを追加します。1 ... 2 "warehouseLocation": { 3 "description": "Coordinates of the warehouse where the product is located.", 4 "$ref": "https://example.com/geographical-location.schema.json" 5 }
外部スキーマ参照を追加した後のスキーマ全体は、以下のようになります。
JSONデータをスキーマに対して検証する
JSONスキーマを作成したので、JSONスキーマバリデーターを使用してJSONデータをスキーマに対して検証します。
バリデーターは、JSONスキーマ仕様を実装したツールです。すべてのバリデーターは同様の方法で動作します。JSONスキーマとJSONインスタンスを入力として受け取り、検証結果を出力として返します。
実際に試してみるには、「ツール」にアクセスして、ニーズに合ったバリデーターを選択するか、以下のエディターを使用してさまざまなスキーマとインスタンスを探索し、さまざまな検証結果を確認してください。
JSONスキーマ
1JSONインスタンス
1検証結果
次にすること
JSONスキーマを作成し、それを使用してJSONデータを検証する方法がわかったので、JSONスキーマの学習を続けていきましょう。
- リファレンスドキュメントにアクセスして、JSONスキーマの詳細をご覧ください。
- 仕様の最新バージョン(2020-12)の詳細をご覧ください。
JSON Schemaの作成方法をすでに理解しており、スキーマ生成、コード生成、ドキュメント、UI生成、JSON Schema処理または変換など、さまざまなJSON Schemaユースケースを探している場合は、ツールにアクセスして、JSON Schemaエコシステムで利用可能な素晴らしいツールをご確認ください。