JavaScript Object Notation

























JSON

JSON vector logo.svg
拡張子
.json
MIMEタイプ
application/json
種別
Data interchange
国際標準
IETF STD 90
RFC 8259
ECMA-404 2nd edition

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




目次






  • 1 特徴


    • 1.1 JSONの発見




  • 2 表記方法


    • 2.1 エンコーディング




  • 3 AjaxにおけるJSONの利用


    • 3.1 古典的な例


    • 3.2 新しい記法を利用した例




  • 4 他のデータ記述法との関係


  • 5 実装


  • 6 出典


  • 7 関連項目


  • 8 外部リンク





特徴


JSONはウェブブラウザなどでよく使われているECMA-262, revision 3準拠のJavaScript[1] (ECMAScript) をベースとしている。2006年7月にRFC 4627で仕様が規定され、その後、何度か改定され、2017年12月14日[2]にIETF STD 90およびRFC 8259およびECMA-404 2nd editionが発表された。MIMEタイプは application/json、拡張子はjsonとされた。


IETFおよびECMAの仕様の改定の歴史




  • 2006年7月 - RFC 4627


  • 2013年3月 - RFC 7158


  • 2013年10月 - ECMA-404 1st edition


  • 2014年3月 - RFC 7159


  • 2017年12月14日[2] - RFC 8259およびIETF STD 90およびECMA-404 2nd edition


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


JSONは単純であるので、特にAjaxの分野で利用が広がりつつある。JavaScriptでJSONをパースして読み込むには、文字列をJavaScriptのコードとして解釈させる eval 関数を作用させるだけでよい(ただし、セキュリティ上の問題があるうえ、U+2028 LINE SEPARATOR と U+2029 PARAGRAPH SEPARATOR の扱いがJavaScriptと互換性が無いため、JSON専用のパース関数の JSON.parse() を利用するべきである)。このように、広く普及しているウェブブラウザ搭載言語であるJavaScriptで簡単に読み込めるため、Ajaxの開発者達から注目を浴びることになった。


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



JSONの発見


ダグラス・クロックフォード(英語版)はJavaScriptのプログラマで、JSONを広めた一人だが、「The JSON Saga」と題したプレゼンテーション[3]中で「自分はJSONと名付けたが、考案者ではなく、それ自体は“自然に”存在していたもので、早い例としては1996年にはNetscape Navigatorでデータ交換用に使われていた。だから“発見した”ということになるのだが、発見したのも自分が最初ではない」といったように述べている。以上のことを縮めて「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としては不正な表記である。



エンコーディング


RFC 8259より、閉じられたエコシステムで利用する場合を除き、文字コードはUTF-8でエンコードすることが必須 (MUST) となっている。ネットワークでJSONを送信する場合は、バイトオーダーマークを先頭に付加してはいけない (MUST NOT)。


過去のIETFの仕様では、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_request はXMLHttpRequestオブジェクトであり、それを url にアクセスして返ってきたJSONで記述されたデータを the_object に格納される。いま、XMLHttpRequestを用いて実装をしたが、iframeなどの他の実装方法もある。また、JavaScriptライブラリのprototype.jsではHTTPの X-JSON ヘッダを利用して簡単にJSONデータの受渡しができる。



他のデータ記述法との関係



XML

JSONはXMLと違ってマークアップ言語ではない。ウェブブラウザから利用できるという点では共通している。また両者とも巨大なバイナリデータを扱う仕組みがないことが共通している。

YAML

JSONはYAMLのサブセットと見なしてよい[4]。YAMLにはブロック形式とインライン形式(フロー形式)の表記法があるが、JSONは後者にさらに制約を加えたものと捉えることができる。例えばRubyでは以下のようにしてJSONをYAMLとして読み込むことができる:

the_object = YAML.load('{"name": "John Smith", "age": 33}')

YAML 1.1以前は、配列と連想配列の区切りをそれぞれ , のようにカンマ+スペースの形にすることでJSONのスーパーセットとなったが、YAML 1.2では区切り文字も互換となったため、正常なJSON文書においては公式に完全なスーパーセットとなった。僅かな相違点として、連想配列のキーがユニークであるべきことをJSONではSHOULDレベルで要請するのに対し、YAML 1.2ではMUSTレベルで要請している[5]為、該当する異常データのエラーハンドリングに違いが出る可能性はある。



実装


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



出典


[ヘルプ]




  1. ^ “Introducing JSON”. json.org. 2008年4月19日閲覧。

  2. ^ abongoing by Tim Bray · The Last JSON Spec


  3. ^ Douglas Crockford: The JSON Saga - YouTube


  4. ^ “YAML is JSON”. 2009年7月22日時点のオリジナルよりアーカイブ。2013年5月15日閲覧。


  5. ^ “3.2.1. Representation Graph - YAML Ain’t Markup Language (YAML™) Version 1.2”. yaml.org. 2013年5月15日閲覧。




関連項目







  • Ajax

  • JSONP

  • JSON Schema

  • JSON-RPC

  • JSON Web Token

  • MooTools

  • コンピュータ言語



外部リンク




  • Introducing JSON (英語)


  • JSONの紹介 (日本語)

  • IETFの仕様書


    • IETF STD 90 および RFC 8259

    • 古い廃止された仕様書


      • RFC 4627 (英語)


      • RFC 7158 (英語)


      • RFC 7159 (英語)






  • ECMA-404 (英語)






Popular posts from this blog

Nidaros erkebispedøme

Birsay

Was Woodrow Wilson really a Liberal?Was World War I a war of liberals against authoritarians?Founding Fathers...