1概要



JSONスキーマ


は、


JSONオブジェクト


の形式と構造を検証するための宣言型言語です。有効な

JSON Object

がどのように見えるかを正確に記述するために特別なプリミティブの数を指定することができます。


JSON Schema

仕様は3つの部分に分けられます。

JSON Schema Core仕様は、スキーマの用語が定義されているところです。

検証]:JSONスキーマ検証仕様は、検証制約を定義するための有効な方法を定義した文書です。このドキュメントでは、JSON APIの検証を指定するために使用できる一連のキーワードも定義しています。以下の例では、これらのキーワードのいくつかを使用します。

Hyper-Schema]:これはJSON Schema仕様のもう1つの拡張です。ここで、ハイパーリンクおよびハイパーメディア関連のキーワードが定義されています。


2 JSONスキーマの定義


JSON Schema

の用途を定義したので、

JSON Object

とそれを記述する対応する

JSON Schema

を作成しましょう。

以下は、製品カタログを表す単純な

JSON Object

です。

{
    "id": 1,
    "name": "Lampshade",
    "price": 0
}

その

JSONスキーマ

を次のように定義できます。

{
    "$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スキーマ



JSONドキュメント

であり、そのドキュメントはオブジェクトでなければなりません。

JSON Schema

によって定義されたオブジェクトメンバ(またはプロパティ)は


keywords


と呼ばれます。

サンプルで使用したキーワードについて説明しましょう。



  • $ schema


    キーワードは、このスキーマは次のように記述されていることを示しています。

ドラフトv4仕様へ。



  • title


    および


    description


    キーワードは、説明のためだけのものです

検証対象のデータに制約が追加されないこと。スキーマの意図は、次の2つのキーワードで説明されています。製品を説明します。



  • type


    キーワードは、

    JSON

    の最初の制約を定義します

データ:** JSONオブジェクトである必要があります。

また、JSONスキーマはスキーマキーワードではないプロパティを含んでもよい(MAY)。私たちの場合、


id





name





price




JSON Object

のメンバー(またはプロパティ)になります。

それぞれのプロパティに対して、


type


を定義できます。

id



name




string




price




number


と定義しました。

JSONスキーマ

では、数は最小値を持つことができます。デフォルトでは、この最小値は包括的なので、


exclusiveMinimum


を指定する必要があります。

最後に、

Schema

は、

id



name

、および

price




必須


であることを示します。


3 JSONスキーマによる検証

私たちの

JSON Schema

を適切に配置することで

私たちの

JSON Object

を検証できます

このタスクを達成するために多くのhttp://json-schema.org/implementations.html[libraries]があります。この例では、Java

json-schema

ライブラリを選択しました。

まず最初に、

pom.xml

に次の依存関係を追加する必要があります。

<dependency>
    <groupId>org.everit.json</groupId>
    <artifactId>org.everit.json.schema</artifactId>
    <version>1.3.0</version>
</dependency>

最後に、__JSONオブジェクトを検証するための簡単なテストケースをいくつか書くことができます。

@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スキーマとは何か、またスキーマを定義するのに適切なキーワードを定義しました。

この記事の簡単なテストケースはhttps://github.com/eugenp/tutorials/tree/master/json[GitHubプロジェクト]にあります。