JSON Schema is a JSON based format for defining the structure of JSON data.

22日(米国時間)、JSON Schemaの4つ目にして最新のドラフト版がIETFにおいて公開された。わかりやすいサンプルと実装系はJSON Schemaにまとまっている。JSON Schemaの基本となるアイディアと実装は2008年には登場していたが、最初のドラフトが公開されたのは1年ほど前となる2009年12月。最初のドラフトが公開されてから1年が経過したことになる。

JSONはJavaScriptで評価するだけでオブジェクトとして利用できる手軽さから、JavaScriptにおけるデータ交換用のフォーマットとして広く普及している。可読性がありフォーマットそのものが簡単ということもあり高い支持を得ている。JSON SchemaはこのJSONデータの構造などを規定するスキーマとして提案されている。JSON SchemaそのものもJSONであり、現在の実装のままで扱いやすいという特徴がある。

JSON Schemaはデータの整合性を確認する点で役に立つ。JSONは手軽である反面、XMLのように厳密にデータの整合性をチェックする方法がない。このため、想定しないJSONデータが渡された、または誤ったJSONデータを生成して利用ているといったことに気が付きにくい。JSON Schemaを利用することでJSONデータが想定した内容になっているかをチェックできるようになる。

たとえば、JSON Schemaの簡単な例は次のとおり。id、name、priceという3つのプロパティがあり、それぞれ必須、。値は数字、文字列、数字になっており、priceに関しては0以上10,000以下の数字であることが要求されている。

var schema = {
  "type" : "object",
  "properties" : {
    "id"    : { "type":"number", "required":true},
    "name"  : { "type":"string", "required":true},
    "price" : { "2500":"number", "minimum":0, "maximum":10000, "required":true}
  }
}

次のJSONデータはJSON Schemaで記述した決まりに準拠している。

var json = {
  "id" : 0001,
  "name" : "JSON Schema Book",
  "price" : 2500
}

次のJSONデータは規定を満たしていない。

var json = {
  "id" : 0001,
  "name" : "JSON Schema Book",
  "price" : -1
}

JSON Schemaを使うと、準拠しているかどうかを自動的に判定できる。実装系はいくつかあるが、ここではJSON Schemaの仕様策定者が優れたライブラリとして薦めているJSVを使った例を紹介する。仕様策定者が開発しているライブラリはCommonJSでの利用したものでブラウザではなくサーバサイドでの実行を想定しているので、サーバサイドで実行したい場合には仕様策定者のオリジナルを採用すればいい。上記のスキーマとデータはそれぞれproduct-jsonschema.js、product-json01.js、product-json02.jsというファイルに保存してあるものとする。JSVは同じディレクトリに展開してあるものとする。

次のHTMLは適切な方のJSONデータを検証している。

<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>JSON Schemaを使った検証デモ その1</title>
  <script type="text/javascript" src="uri/uri.js"></script>
  <script type="text/javascript" src="jsv.js"></script>
  <script type="text/javascript" src="json-schema-draft-01.js"></script>
  <script type="text/javascript" src="json-schema-draft-02.js"></script>
  <script type="text/javascript" src="json-schema-draft-03.js"></script>
  <script type="text/javascript" src="environments.js"></script>
  <script type="text/javascript" src="product-jsonschema.js"></script>
  <script type="text/javascript" src="product-json01.js"></script>
</head>
<body>
  <script type="text/javascript">
    var JSV = require("jsv").JSV;
    var report = JSV.createEnvironment().validate(json, schema); 
    if (report.errors.length === 0) {
      alert("適切なJSONデータ");
    }
    else {
      alert("不適切なJSONデータ" + report.errors[0].message);
    }
  </script>
</body>
</html>

次のHTMLは不適切な方のJSONデータをデータを検証している。

<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>JSON Schemaを使った検証デモ その2</title>
  <script type="text/javascript" src="uri/uri.js"></script>
  <script type="text/javascript" src="jsv.js"></script>
  <script type="text/javascript" src="json-schema-draft-01.js"></script>
  <script type="text/javascript" src="json-schema-draft-02.js"></script>
  <script type="text/javascript" src="json-schema-draft-03.js"></script>
  <script type="text/javascript" src="environments.js"></script>
  <script type="text/javascript" src="product-jsonschema.js"></script>
  <script type="text/javascript" src="product-json02.js"></script>
</head>
<body>
  <script type="text/javascript">
    var JSV = require("jsv").JSV;
    var report = JSV.createEnvironment().validate(json, schema); 
    if (report.errors.length === 0) {
      alert("適切なJSONデータ");
    }
    else {
      alert("不適切なJSONデータ: " + report.errors[0].message);
    }
  </script>
</body>
</html>

検証結果はそれぞれ次のとおり。

正しいJSONデータだと認識されている

不適切なJSONデータだと認識されており、理由にも数字が指定された最小値よりも小さいことが説明されている

JSON Schemaが標準規約として策定され広く使われるようになるかはまだわからない。JSONは手軽に扱えるところに利点を見出すユーザも多く、スキーマの利用を好まない向きもある。ただし、開発中にJSONデータの妥当性を検証するためのツールとして活用するなど、JSON Schemaには有益な活用用途がある。JSONデータを使うシステムを開発している場合、こうした検証ツールがあること、その仕様策定が進んでいることなどに留意しておきたい。

なお、仕様の策定を担当しているKris Zyp氏はフルフィーチャJavaScriptフレームワークDojoの開発者でもある。Dojoは大規模Webアプリケーションの開発にも利用できるように構築されているフレームワークで、JSON Schemaを策定することになった背景にはDojoにおいて利用するという目的があるとみられる。