最近、Ajaxアプリを作るときのデータ形式にJSONフォーマットが使用される事が増えてきました。そこでJSONとは何ぞや?という人向けに簡単に解説します。
JSON形式はRFC4627でも定義されている形式で、JavaScript Object Notationの略です。データ構造を表現する為に使用でき、JavaScriptではeval関数でそのまま評価できる形式になっています。ただし、JavaScriptに依存しない形式と定義されていて、実際に各言語向けのパーサやシリアライザが公開されています。
実際は以下のような感じで記述されます。
扱えるデータ型は文字列型、数値型、ブール型、配列型、オブジェクト型、nullだけで、配列型とオブジェクト型はどのようにネストしても構いません。JavaScriptでは以下のような感じで使えます。(Ajaxによって上記データがサーバより送信されたと想定します)
と、こんな感じでAjaxで受信した後のコードが非常にシンプルになります。通常ブラウザはクロスドメインでは利用できないので、外部のユーザが自由にJSON形式を編集できないようなサイトであれば、eval関数で評価するだけでよくなります。ただしクロスドメインで利用できる場合は危険が伴いますので、事前にバリデーションしてから評価する必要があります。バリデーションもJSON向けのライブラリには含まれていることが多いです。
ちなみに何故JSON形式をeval関数で評価すると危険なのかというと、クロスドメインでJSONデータを取得して評価する場合、そのJSONデータに悪意のある関数が含まれていると、そのユーザで実行されてしまうのです。
GoogleのGmailのJSONデータが有名ですが、Gmailの場合、JSONデータの先頭にwhile(1);が付いています。何も知らずにクロスドメインで取得して評価すると無限ループに陥ります。有名な手法なので先頭の文字を除去してから評価すればよいのですが・・・
実は1つ前のブログに書いたベータリリース予定のサイトでも使っています。サーバ側はブラウザからREST形式でリクエストを受け取って業務処理を行い、ブラウザに対してJSON形式で返すようにしています。JSON形式を作成する為に、JavaのJSONシリアライザを手作りしました。
さらにJSON他にJSONPという形式がありますが、これについては今度書きます。