鱒身(Masu_mi)のブログ

知った事をメモする場所。

JSON Schema の感じをつかむ

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

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

JSON Schema について

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

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でバリデーションを試してみた。

{
  "$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 でインストールする。

composer init
composer require justinrainbow/json-schema ~1.3
composer install

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

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

<?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));

実行結果を見る

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

$ php -d open_basedir=/ ./test.php
array(1) {
  [0] =>
  array(2) {
    'property' =>
    string(0) ""
    'message' =>
    string(27) "the property id is required"
  }
}