想定通りに JSON サービスが動作することを前提にしている Ajax アプリケーションは、そのサービスから返されるレスポンスが想定外のフォーマットであったり、レスポンスの内容が無効であったりすると、予期せぬ振る舞いをする可能性があります。複雑なアプリケーションの場合、サービスからのレスポンスを検証するカスタム・ルーチンを実装することで、予期せぬ振る舞いをするリスクを軽減することができます。あるいは、JSON Schema を活用して、受信データの妥当性を検証することもできます。
JSON Schema は JSON ベースのフォーマットを規定して JSON データの構造を定義するためのドラフト標準です。この記事の執筆時点で、最新バージョンは draft-03 です (「参考文献」を参照)。
この記事では JSON Schema に基づく妥当性検証ルーチンをいくつか取り上げ、それらを比較します。また、最も重要なライブラリーの使い方を学び、通信を検証するためのライブラリーを作成する上での考慮事項とベスト・プラクティスについて探ります。この記事には JSON Schema を作成する上で役立つ新しいユーティリティーも含まれています。
この記事で使用しているサンプルをダウンロードしてください。
アプリケーションで使用するライブラリーを選択しようとすると、その作業は複雑なものになる場合があります。各アプリケーションにはさまざまな制約があり、それらの制約が選択肢に影響を与えます。表 1 に、JSON Schema の 4 種類の JavaScript ライブラリーの概要を示します。
表 1. JSON Schema による妥当性検証用 JavaScript ライブラリー
| ライブラリー (作成者) | サポートするドラフトのバージョン | ライブラリーの概略サイズ |
|---|---|---|
| JSV: JSON Schema Validator (Gary Court) | draft-01, draft-02, draft-03 | 120KB |
| json-schema (Kris Zyp) | draft-03 | 10KB (CommonJS が必要) |
| dojox.json.schema (Kris Zyp) | draft-02 | 10KB (Dojo が必要) |
| schema.js (Andreas Kalsch) | draft-02 (部分的にサポート) | 10KB (CommonJS が必要) |
Dojo ツールキットには dojox.json.schema ライブラリーが含まれているため、Dojo ベースのアプリケーションには dojox.json.schema ライブラリーを使用できるかもしれません。複数のバージョンの (ドラフト) 標準をサポートする必要があるアプリケーションには JSV を使用できるかもしれません。
dojox.json.schema は json-schema から分岐したものらしいので、使い方も似ているはずです。schema.js は draft-02 のサブセットのみを実装しています。この記事では dojox.json.schema と JSV を使用する例に焦点を絞ります。
リスト 1 に単純なオブジェクトの妥当性を検証する HTML スニペットを示します。このスニペットは HTML の head 要素に挿入して使用するように設計されています。
リスト 1. dojox.json.schema の使用例
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.0/dojo/dojo.js"
type="text/javascript"></script>
<script type="text/javascript">
require(["dojox/json/schema"], function() {
// Object to validate
var successObj = {
"foo" : "bar"
};
var failureObj = {
"foo" : 1234
};
// Schema
var schema = {
"type": "object",
"properties" : {
"foo" : {
"type" : "string"
}
}
};
// Run validation, which should succeed
// Change this line to use failureObj to see the failure case
var result = dojox.json.schema.validate(successObj, schema);
// Check results
if (result.valid) {
// Success, do something
alert("Object is valid");
} else {
// Failure - extract the errors array
var errorArr = result.errors;
alert("property : " + errorArr[0].property + "\nmessage : "
+ errorArr[0].message);
}
});
</script>
|
リスト 2 は単純なオブジェクトの妥当性を検証する HTML スニペットです。このスニペットは HTML の head 要素に挿入して使用するように設計されています。
リスト 2. JSV の使用例
<!-- NB: For actual use, you should download a copy of the libraries yourself.
github is not a CDN. -->
<script src="https://raw.github.com/garycourt/JSV/master/lib/uri/uri.js"
type="text/javascript"></script>
<script src="https://raw.github.com/garycourt/JSV/master/lib/jsv.js"
type="text/javascript"></script>
<script src="https://raw.github.com/garycourt/JSV/master/lib/json-schema-draft-03.js"
type="text/javascript"></script>
<script type="text/javascript">
// Object to validate
var successObj = {
"foo" : "bar"
};
var failureObj = {
"foo" : 1234
};
// Schema
var schema = {
"type": "object",
"properties" : {
"foo" : {
"type" : "string"
}
}
};
// Run validation, which should succeed
var env = JSV.createEnvironment("json-schema-draft-03");
// Change this line to use failureObj to see the failure case
var result = env.validate(successObj, schema);
// Check result
if (result.errors.length === 0) {
// Success, do something
alert("Object is valid");
} else {
// Failure - extract the errors array
var errorArr = result.errors;
alert("uri : " + errorArr[0].uri + "\nmessage : "
+ errorArr[0].message);
}
</script>
|
JSV は errors 配列によって高度な障害情報を提供することができます。各エラーには以下の属性が含まれる場合があります。
- message: 人間が読むことのできるエラー・メッセージ
- uri: 障害が発生したオブジェクトの場所の URI
- schemaUri: 障害の原因となっているスキーマの場所の URI
- Attribute: 障害の原因となっているスキーマの制約
- Details: 詳細情報 (想定される値など) を含むフリー・フォームの配列
JSON Schema による妥当性検証を XMLHttpRequest と組み合わせる
複雑な Ajax アプリケーションを開発している場合には、上記の手法を使用して Ajax 通信での妥当性検証を行うことを検討してください。スキーマが JavaScript オブジェクトして用意されていると、オブジェクトの妥当性検証を行うのは簡単です。スキーマ・オブジェクトを取得するためのソリューションはたくさんあります。
スキーマを取得して通信での妥当性検証を行うライブラリーを作成する場合には、以下の点を考慮する必要があります。
- ページ・ロードのオーバーヘッド。スキーマをプリロードする方法は魅力的に思えるかもしれませんが、ページのロードに時間がかかるようになる可能性があります。
- Ajax 呼び出しに対するオーバーヘッド。スキーマを遅延ロードすると、各スキーマを使用する際の最初の呼び出しに影響します。すべての通信に対して妥当性検証を行うと、パフォーマンスに問題が起きる可能性があります。妥当性検証の対象を複雑なサービスのみに限定することを検討してください。
JSON Schema の定義には数多くの微妙な要素が含まれているため、スキーマの作成やテストは困難な作業になる可能性があります。この記事には JSON Schema のための Lint ユーティリティーが含まれています。このユーティリティーをダウンロードすると JSON Schema の作成やテストに役立ちます。
- JSON Schema のインターネット・ドラフト (「参考文献」を参照) には、JSON Schema 仕様の完全な定義が記述されており、非常に貴重なリソースです。必ず最新のドラフトを見てください。
- サービスのドキュメント作成を支援するために JSON Schema を使用することを検討してください。
description属性を使用することでプロパティーを記述することができます。 - スキーマを作成する場合には、どの程度厳密な妥当性検証がアプリケーションに必要か、バランスを考える必要があります。すべての属性を定義すれば厳密な妥当性検証ができるかもしれませんが、サービスがアプリケーションと共に進化していく場合には、その定義はすぐに意味のないものになるかもしれません。そうした場合のために、JSON Schema では部分的な妥当性検証ができるようになっています。
- JSON Schema の高度な機能を使用すると、プロパティーを固定することができます。
additionalProperties、enum、minItems、maxItemsなどを使用すると制約を強化することができます。 - 複数のタイプが考えられるプロパティーを許容する必要がある場合には、配列を使用すると、それらのタイプを定義することができます。あるいは
anyタイプを使用することもできます。
この記事では、JSON Schema に対して JavaScript オブジェクトの妥当性を検証する方法について、2 つのライブラリーを使用して学びました。また、通信での妥当性検証を行うためのライブラリーを作成する際に考慮すべき事項や、スキーマを作成する際のベスト・プラクティスについても探りました。この記事で提供しているユーティリティーは、独自のスキーマを作成してテストする作業を補助するツールとして使用することができます。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| Sample, showing use of dojox.json.schema | dojox_json_schema-example.html | 2KB | HTTP |
| Sample, showing use of JSV | jsv-example.html | 2KB | HTTP |
| Utility for creating and testing JSON Schema | jsonschema.zip | 140KB | HTTP |
学ぶために
- JSON Schema: 最新のスキーマ、ツール、議論について学んでください。
- A JSON Media Type for
Describing the Structure and Meaning of JSON Documents: JSON Schema インターネット・ドラフトの最新版 (IETF (Internet Engineering Task Force) のワーキング・ドキュメント) を読んでください。
- dojox.json.schema
のドキュメント: dojox.json.schema がどのように JSON Schema を実装し、JSON Schema に対してデータ検証を行っているかを学んでください。
- Gary Court
による JSV ライブラリー: JavaScript で実装され、拡張可能で完全に仕様に準拠した JSON Schema バリデーターについて学んでください。
- Andreas
Kalsch による schema.js ライブラリー: この高度で JSON Schema ベースのデータ検証および変換ライブラリーについての情報を入手してください。
- Kris
Zyp による json-schema ライブラリー: JSON Schema の仕様、リファレンス・スキーマ、そして CommonJS 実装についての資料を読んでください。
- developerWorks の Web development
ゾーン: Web ベースのさまざまなソリューションを解説した記事が豊富に用意されています。Web development 技術文書一覧に用意された、さまざまな技術記事やヒント、チュートリアル、技術標準、IBM Redbooks をご覧ください。
- developerWorks の Technical events
and webcasts: これらのセッションで最新技術を入手してください。
- developerWorks Live!
briefing: IBM の製品およびツールについての情報や IT 業界の動向についての情報を迅速に把握してください。
- developerWorks On demand
demos: 初心者のための製品インストール方法やセットアップのデモから、上級開発者のための高度な機能に至るまで、多様な話題が解説されています。
- developerWorks は Twitter を利用しています。今すぐ developerWorks のツイートをフォローしてください。
製品や技術を入手するために
- IBM 製品の評価版: IBM 製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2、Lotus、Rational、Tivoli、WebSphere などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。
議論するために
- developerWorks コミュニティー: ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者によるブログ、フォーラム、グループ、ウィキを調べることができます。
- Web 開発に関心を持つ他の developerWorks
メンバーを見つけてください。
