前回までに、HTML、microformats、AtomというXML系のリソース表現を解説した。ここではより軽量なデータ表現形式である、JavaScriptの記法でデータを記述できるJSONについて説明する。
1 JSONとは
JSON(JavaScript Object Notation)とは、RFC 4627が規定するデータ記述言語で、JavaScriptの記法でデータを記述できる点が最大の特徴である。JSONはXMLのように文書をマークアップすることには向いていないが、ハッシュや配列といったプログラミング言語から扱いやすいデータ構造を記述できる。
2 メディアタイプ
JSONのメディアタイプは「application/json」である。XMLやHTMLと同様に、特別な理由がない限りはUTF-8を使うのが無難である。
3 拡張子
JSONファイルには「.json」という拡張子を用いることが推奨されている。
4 データ型
JSONに組み込みで用意されているデータ型には次の6つがある。オブジェクト、配列、文字列、数値、ブーリアン、nullである。
オブジェクト
オブジェクトは名前と値の集合である。名前と値の組をオブジェクトの「メンバ」と呼ぶ。JavaScriptではメンバの名前に識別子や数値もとれるが、JSONではメンバの名前は常に文字列である。オブジェクトは「{」で始まり「}」で終わる。メンバは「,」で区切り、メンバの名前と値は「:」で区切る。
配列
配列は順序を持った値の集合である。0個以上の値を持てる。配列は「[」で始まり、「]」で終わる。値は「,」で区切る。
文字列
JSONの文字列は必ず二重引用符(”)で囲む。どのような文字も「\uXXXX」という形式(「\u」に続けて4桁の16進数で表現したUnicode番号)でエスケープできる。
数値
JSONの数値には整数と浮動小数点数の両方が含まれている。数値の表記は10進表記に限る。
ブーリアン
値に真か偽をとるブーリアン型はリテラル(プログラムのソースコードで直接記述する変数や定数以外の値)で用意されている。「true」と「false」のように必ずすべてを小文字で書く必要がある。
null
null値(プログラミング言語において値がないことを意味する値)もリテラルで用意されている。必ず「null」と小文字で書く必要がある。
日時
JSONには組み込み型としての日時型がない。そのため、例えばUNIX時間を数値として表現する方法がある。タイムゾーンを扱う必要がある場合は、JavaScriptのDateクラスのtoString()関数で出力した文字列が利用できる。
リンク
JSONでリンクを実現するには、単純にURIを文字列値として持つのが最も簡単である。URIは絶対URIにしておくのが無難である。
5 JSONPによるクロスドメイン通信
JSONでリソース表現を提供する副次的効果として、JSONP(JSON with Padding)を利用できることがある。
クロスドメイン通信の制限
クロスドメイン通信とは、不特定多数のドメインに属するサーバにアクセスすることである。Ajaxで用いるXMLHttpRequestというJavaScriptのモジュールは、セキュリティ上の制限からJavaScriptファイルを取得したのと同じサーバとしか通信できないという制限がある。
<script>要素による解決
この問題は<script>要素を用いることで、複数のサイトからJavaScriptファイルを読み込むことができる。
コールバック関数を活用するJSONP
JSONPは、<script>要素がブラウザのセキュリティ制限を受けないという性質を利用してクロスドメイン通信を実現する手法である。JSONPではオリジナルのJSONをクライアントが指定したコールバック関数名でラップして、ドメインの異なるサーバからデータを取得する。
6 ハイパーメディアフォーマットとしてのJSON
JSONはデータ記述に適したフォーマットだが、リソースを表現するフォーマットとして考えた場合はハイパーメディアフォーマットとしての側面を忘れてはならない。JSONをハイパーメディアフォーマットとして使うためには、リンクを実現するメンバを入れる必要がある。
最後に
JSONはJavaScriptをベースにしたシンプルなデータフォーマットである。JavaScriptはもちろん、各種のプログラミング言語がライブラリを用意している。また、XMLと比べると冗長性が低いという利点があるため、主にデータ表現のフォーマットとして利用されている。さらに、JSONPを使うとクロスドメイン通信ができるので、Ajaxでは必須の技術となっている。
次回は、郵便番号検索サービスなど、読み取り専用Webサービスの設計についてまとめる。
![]() |