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

Where did Arya get these scars? Unicorn Meta Zoo #1: Why another podcast? Announcing the arrival of Valued Associate #679: Cesar Manara Favourite questions and answers from the 1st quarter of 2019Why did Arya refuse to end it?Has the pronunciation of Arya Stark's name changed?Has Arya forgiven people?Why did Arya Stark lose her vision?Why can Arya still use the faces?Has the Narrow Sea become narrower?Does Arya Stark know how to make poisons outside of the House of Black and White?Why did Nymeria leave Arya?Why did Arya not kill the Lannister soldiers she encountered in the Riverlands?What is the current canonical age of Sansa, Bran and Arya Stark?