はじめに
初めてのスキーマの作成
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スキーマ
1
JSONインスタンス
1
検証結果
次にすること
JSONスキーマを作成し、それを使用してJSONデータを検証する方法がわかったので、JSONスキーマの学習を続けていきましょう。
- リファレンスドキュメントにアクセスして、JSONスキーマの詳細をご覧ください。
- 仕様の最新バージョン(2020-12)の詳細をご覧ください。
JSON Schemaの作成方法をすでに理解しており、スキーマ生成、コード生成、ドキュメント、UI生成、JSON Schema処理または変換など、さまざまなJSON Schemaユースケースを探している場合は、ツールにアクセスして、JSON Schemaエコシステムで利用可能な素晴らしいツールをご確認ください。