目次


JSON Schema による妥当性検証をリッチ・インターネット・アプリケーションの中で使用する

JSV と Dojo を使用して堅牢性を高める

Comments

概要

想定通りに 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-03120KB
json-schema (Kris Zyp)draft-0310KB (CommonJS が必要)
dojox.json.schema (Kris Zyp)draft-0210KB (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 を使用する例に焦点を絞ります。

dojox.json.schema を使用する

リスト 1 に単純なオブジェクトの妥当性を検証する HTML スニペットを示します。このスニペットは HTML の head 要素に挿入して使用するように設計されています。

リスト 1. dojox.json.schema の使用例
<script src="//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>

JSV を使用する

リスト 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 スキーマを作成する

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 つのライブラリーを使用して学びました。また、通信での妥当性検証を行うためのライブラリーを作成する際に考慮すべき事項や、スキーマを作成する際のベスト・プラクティスについても探りました。この記事で提供しているユーティリティーは、独自のスキーマを作成してテストする作業を補助するツールとして使用することができます。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development
ArticleID=812262
ArticleTitle=JSON Schema による妥当性検証をリッチ・インターネット・アプリケーションの中で使用する
publish-date=05102012