JavaのJSONスキーマの概要
1. 概要
JSON Schemaは、JSON Objectの形式と構造を検証するための宣言型言語です。 これにより、特別なプリミティブの数を指定して、有効なJSON Objectがどのように見えるかを正確に記述することができます。
JSON Schema仕様は、次の3つの部分に分かれています。
-
JSON Schema Core:JSON Schema Core仕様は、スキーマの用語が定義されている場所です。
-
JSON Schema Validation:JSONスキーマ検証仕様は、検証制約を定義するための有効な方法を定義するドキュメントです。 このドキュメントでは、JSON APIの検証を指定するために使用できるキーワードのセットも定義しています。 以下の例では、これらのキーワードのいくつかを使用します。
-
JSON Hyper-Schema:これはJSONスキーマ仕様の別の拡張であり、ハイパーリンクおよびハイパーメディア関連のキーワードが定義されています。
2. JSONスキーマの定義
JSON Schemaの使用目的を定義したので、JSON Objectとそれに対応するJSON Schemaを作成してみましょう。
以下は、製品カタログを表す単純なJSON Objectです。
{
"id": 1,
"name": "Lampshade",
"price": 0
}
そのJSON Schemaを次のように定義できます。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Product",
"description": "A product from the catalog",
"type": "object",
"properties": {
"id": {
"description": "The unique identifier for a product",
"type": "integer"
},
"name": {
"description": "Name of the product",
"type": "string"
},
"price": {
"type": "number",
"minimum": 0,
"exclusiveMinimum": true
}
},
"required": ["id", "name", "price"]
}
ご覧のとおり、JSON SchemaはJSON documentであり、そのドキュメントはオブジェクトである必要があります。 JSON Schemaで定義されたオブジェクトメンバー(またはプロパティ)は、keywordsと呼ばれます。
サンプルで使用したキーワードについて説明しましょう。
-
$schemaキーワードは、このスキーマがドラフトv4仕様に従って記述されていることを示しています。
-
titleおよびdescriptionキーワードは、検証されるデータに制約を追加しないという点で、説明的なものにすぎません。 スキーマの意図は、次の2つのキーワードで示されます。製品を説明します。
-
JSONデータのtypeキーワードdefines the first constraint:has to beはJSON Objectです。
また、JSONスキーマには、スキーマキーワードではないプロパティが含まれる場合があります。 この場合、id、name、priceはJSON Objectのメンバー(またはプロパティ)になります。
プロパティごとに、typeを定義できます。 idとnameをstringとして定義し、priceをnumberとして定義しました。 JSON Schemaでは、数値に最小値を設定できます。 デフォルトでは、この最小値は包括的であるため、exclusiveMinimumを指定する必要があります。
最後に、Schemaは、id、name、およびpriceがrequiredであることを示します。
3. JSONスキーマによる検証
JSON Schemaを配置すると、we can validateがJSON Objectになります。
このタスクを実行するための多くのlibrariesがあります。 この例では、Javajson-schemaライブラリを選択しました。
まず、pom.xmlに次の依存関係を追加する必要があります。
org.everit.json
org.everit.json.schema
1.3.0
最後に、JSON Object:を検証するための簡単なテストケースをいくつか作成できます。
@Test
public void givenInvalidInput_whenValidating_thenInvalid() throws ValidationException {
JSONObject jsonSchema = new JSONObject(
new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/schema.json")));
JSONObject jsonSubject = new JSONObject(
new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/product_invalid.json")));
Schema schema = SchemaLoader.load(jsonSchema);
schema.validate(jsonSubject);
}
この場合、スローされたValidationExceptionは#/price.を指します。コンソールを見ると、次の出力が出力されます。
#/price: 0.0 is not higher than 0
2番目のテストは次のようになります。
@Test
public void givenValidInput_whenValidating_thenValid() throws ValidationException {
JSONObject jsonSchema = new JSONObject(
new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/schema.json")));
JSONObject jsonSubject = new JSONObject(
new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/product_valid.json")));
Schema schema = SchemaLoader.load(jsonSchema);
schema.validate(jsonSubject);
}
有効なJSON Objectを使用しているため、検証エラーはスローされません。
4. 結論
この記事では、JSONスキーマとは何か、スキーマを定義するための関連キーワードthat helps usを定義しました。
[#result_box .short_text]#JSON Schemaを対応するJSON Object表現と結合すると、いくつかの検証タスクを実行できます。 #
この記事の簡単なテストケースは、GitHub projectにあります。