JavaScript Object Notation

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
JSON
拡張子 .json
MIME Type application/json
種別 Data interchange
国際標準 RFC 4627
テンプレートを表示

JSON(ジェイソン、JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptにおけるオブジェクトの表記法をベースとしているが、JSONはJavaScript専用のデータ形式では決してなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しに使えるよう設計されている。

特徴[編集]

JSONはウェブブラウザなどでよく使われているECMA-262, revision 3準拠のJavaScript[1] (ECMAScript) をベースとしている。2006年7月RFC 4627で仕様が規定され、MIMEタイプapplication/json拡張子はjsonとされた。

JSONはJavaScriptにおけるオブジェクト表記法のサブセットであるが、JavaScriptでの利用に限られたものではない。

JSONは単純であるので、特にAjaxの分野で利用が広がりつつある。JavaScriptでJSONをパースして読み込むには、文字列をJavaScriptのコードとして解釈させるeval関数を作用させるだけでよい[2]。このように、広く普及しているウェブブラウザ搭載言語であるJavaScriptで簡単に読み込めるため、Ajaxの開発者達から注目を浴びることになった。

JavaScript言語以外でも、ほとんどの言語においてJSONは単純な処理で書き出しや読み込みができる。また、実装されたプログラミング言語数はYAMLより多いと言われる。そのため、JSONは異なるプログラミング言語の間でのデータの受渡しには能率的である。ウェブアプリケーションの場合において、ウェブクライアントでのJavaScriptとのデータの受渡しなどはその最たる活用例と言える。プロセス間通信、マシン間通信においても、疎結合にするため、JSONで情報を受け渡しすることもある。

表記方法[編集]

JSONで表現するデータ型は以下の通りで、これらを組み合わせてデータを記述する。true, false, nullなどは全て小文字でなくてはならない。

  • 数値(整数浮動小数点数
  • 文字列(バックスラッシュによるエスケープシーケンス記法を含む、ダブルクォーテーションでくくった文字列)
  • 真偽値(truefalse
  • 配列(データのシーケンス)
  • オブジェクト(順序づけされていないキーと値のペアの集まり。JSONでは連想配列と等価)
  • null

数値は10進法表記に限り、8進、16進法表記などはできない。また浮動小数点数としては1.0e-10といった指数表記もできる。

文字列は(JSONそれ自体と同じく)Unicode文字列である。基本的にはJavaScriptの文字列リテラルと同様だが、囲むのにシングルクォートは使えない。バックスラッシュによるエスケープがある。

配列はゼロ個以上の値をコンマで区切って、角かっこでくくることで表現する。例えば以下のように表現する:

["milk", "bread", "eggs"]

オブジェクトはキーと値のペアをコロンで対にして、これらの対をコンマで区切ってゼロ個以上列挙し、全体を波かっこでくくることで表現する。例えば以下のように表現する:

{"name": "John Smith", "age": 33}

ここで注意することはキーとして使うデータ型は文字列に限ることである。したがって、

{name: "John Smith", age: 33}

という表記は許されない。この後者の表記はJavaScriptのオブジェクトの表記法としては正しいが、JSONとしては不正な表記である。

エンコーディング[編集]

JSONテキストはUnicodeでエンコードするとされている (SHALL)。デフォルトのエンコーディングはUTF-8である。なお、単独の文字列でない限り最初の2文字は必ずASCII文字であるので、最初の4バイトを見ることにより、UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BEのいずれの形式でエンコードされているか判別できる。

AjaxにおけるJSONの利用[編集]

AjaxにおいてXMLHttpRequestで非同期にJSONでのデータを受け取る例を示す:

古典的な例[編集]

var the_object;
var http_request = new XMLHttpRequest();
http_request.open( "GET", url, true );
http_request.onreadystatechange = function () {
    if ( http_request.readyState == 4 ) {
        if ( http_request.status == 200 ) {
            the_object = eval( "(" + http_request.responseText + ")" );
        } else {
            alert( "There was a problem with the URL." );
        }
        http_request = null;
    }
};
http_request.send(null);

新しい記法を利用した例[編集]

var the_object;
var http_request = new XMLHttpRequest();
http_request.open( "GET", url, true );
http_request.responseType = "json";
http_request.addEventListener ( "load", function ( ev ) {
    if ( ev.target.status == 200 ) {
        the_object = http_request.response;
    } else {
        alert( "There was a problem with the URL." );
    }
    delete http_request;
});
http_request.send(null);

ここでいずれも、http_requestXMLHttpRequestオブジェクトであり、それをurlにアクセスして返ってきたJSONで記述されたデータをthe_objectに格納される。いま、XMLHttpRequestを用いて実装をしたが、iframeなどの他の実装方法もある。また、JavaScriptライブラリprototype.jsではHTTPX-JSONヘッダを利用して簡単にJSONデータの受渡しができる。

他のデータ記述法との関係[編集]

XML
JSONはXMLと違ってマークアップ言語ではない。ウェブブラウザから利用できるという点では共通している。また両者とも巨大なバイナリデータを扱う仕組みがないことが共通している。
YAML
JSONはYAMLのサブセットと見なしてよい[3]。YAMLにはブロック形式とインライン形式(フロー形式)の表記法があるが、JSONは後者にさらに制約を加えたものと捉えることができる。例えばRubyでは以下のようにしてJSONをYAMLとして読み込むことができる:
the_object = YAML.load('{"name": "John Smith", "age": 33}')
YAML1.1以前は、配列と連想配列の区切りをそれぞれ, のようにカンマ+スペースの形にすることでJSONのスーパーセットとなったが、YAML1.2では区切り文字も互換となったため、正常なJSON文書においては公式に完全なスーパーセットとなった。僅かな相違点として、連想配列のキーがユニークであるべきことをJSONではSHOULDレベルで要請するのに対し、YAML1.2ではMUSTレベルで要請している[4]為、該当する異常データのエラーハンドリングに違いが出る可能性はある。

実装[編集]

JSONは多くのプログラミング言語で利用可能である。例えば、ActionScript, C, C++, C#, ColdFusion, Common Lisp, Curl, D言語, Delphi, E, Erlang, Groovy, Haskell, Java, JavaScript (ECMAScript), Lisp, Lua, ML, Objective CAML, Perl, PHP, Python, R, Rebol, Ruby, Scala, Squeakなど。

関連項目[編集]

[編集]

  1. ^ Introducing JSON”. json.org. 2008年4月19日閲覧。
  2. ^ ただし不正なデータに対する耐性から、JavaScriptでもJSON専用のパース関数が作成されている。
  3. ^ YAML is JSON”. 2009年7月22日時点のオリジナルよりアーカイブ。2013年5月15日閲覧。
  4. ^ 3.2.1. Representation Graph - YAML Ain’t Markup Language (YAML™) Version 1.2”. yaml.org. 2013年5月15日閲覧。

外部リンク[編集]