JSON Schema の感じをつかむ

JSON Schema を使ってみた。今回の内容は2つ。

  • JSON Schema への参考資料のリンクを整理する
  • PHPでバリデーションのサンプルをメモする

JSON Schema について

JSON はJavaScriptのオブジェクト表現をベースにしたデータ記述言語で様々なデータ構造を記述できる。 データがあると型・メタ情報を扱いたくなる。JSONデータに対するスキーマ定義の仕様が幾つかある。 JSON Schemaは有力候補の1つ。

JSON Schema 資料集

公式ドキュメントは以下のdraftへのリンクを掲載している。

また、JSON Schema では以下の形式を利用している。

以下にJSON Schema: core definitions and terminologyのアブストを翻訳する。

JSON Schemaは、メディアタイプ"application/schema+json"・JSONデータの構造を定義するJSON に基づいた形式を定義する。 JSON Schema は、どのようなJSONデータが与えられたアプリケーションに要求され、またどのように作用するのか、について契約する。 JSON Schema は、JSONデータに関するバリデーション・ドキュメンテーション・ハイパーリンクナビゲーション・相互作用制御を定義する様に意図している。

JSON Schema defines the media type "application/schema+json", a JSON based format for defining the structure of JSON data. JSON Schema provides a contract for what JSON data is required for a given application and how to interact with it. JSON Schema is intended to define validation, documentation, hyperlink navigation, and interaction control of JSON data.

PHP で使ってみる

以下のJSON Schemaを準備してPHPでバリデーションを試してみた。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://masu-mi.me/url/of/this/schema.json",
  "title": "サンプル用スキーマ",
  "description":"長めの説明",
  "type": "object",
  "properties": {
    "id": {
      "description": "リソースのID。システム中一貫して用いられる。",
      "type": "string",
      "maxLength": 40
    }
  },
  "required": [
    "id"
  ]
}

PHP実装をインストールする

justinrainbow/json-schemacomposer でインストールする。

1
2
3
$ composer init
$ composer require justinrainbow/json-schema ~1.3
$ composer install

PHP でバリデーションのコードを書く

書いたコードは以下の通り。

1
2
3
4
5
6
7
8
<?php
require 'vendor/autoload.php';

$json = '{"a":1, "b":2}';
// JSON Schems を"schema.json"に記述しておく
$schema = file_get_contents('./schema.json');
$v = new JsonSchema\Validator;
$v->check(json_decode($json), json_decode($schema));

実行結果を見る

実行結果は以下。結果を見るとrequired なidが必須って怒られているのでうまく行っていそう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ php -d open_basedir=/ ./test.php
array(1) {
  [0] =>
  array(2) {
    'property' =>
    string(0) ""
    'message' =>
    string(27) "the property id is required"
  }
}
comments powered by Disqus