JavaScript Object Notation
JavaScript Object Notation(JSON、ジェイソン)はデータ記述言語の1つである。軽量なテキストベースのデータ交換用フォーマットでありプログラミング言語を問わず利用できる[1]。名称と構文はJavaScriptにおけるオブジェクトの表記法に由来する。 特徴JSONはウェブブラウザなどでよく使われているECMA-262, revision 3準拠のJavaScript[2] (ECMAScript) をベースとしている。2006年7月にRFC 4627で仕様が規定され、その後、何度か改定され、2017年12月14日[3]にIETF STD 90およびRFC 8259およびECMA-404 2nd editionが発表された。MIMEタイプは IETFおよびECMAおよびISOの仕様の改定の歴史
JSONはJavaScriptにおけるオブジェクト表記法のサブセットであるが、JavaScript以外の言語でも読み込み・書き込みが提供されている。そのため、ウェブアプリケーションでのサーバーとクライアントの間でのデータの受渡しなど、プログラミング言語が異なるプログラミング言語同士での通信でよく使われる。 JavaScriptでJSONを読み込むには、文字列をJavaScriptのコードとして解釈する JSONの発見ダグラス・クロックフォードはJavaScriptのプログラマで、JSONを広めた一人だが、「The JSON Saga」と題したプレゼンテーション[4]中で「自分はJSONと名付けたが、考案者ではなく、それ自体は“自然に”存在していたもので、早い例としては1996年にはNetscape Navigatorでデータ交換用に使われていた。だから“発見した”ということになるのだが、発見したのも自分が最初ではない」といったように述べている。以上のことを縮めて「JavaScriptのオブジェクト表記法からJSONが発見された。」と表現されている場合がある。 表記方法JSONで表現するデータ型は以下の通りで、これらを組み合わせてデータを記述する[5]。
数値は10進法表記に限り、8進、16進法表記などはできない。また浮動小数点数としては 文字列は(JSONそれ自体と同じく)Unicode文字列である。基本的にはJavaScriptの文字列リテラルと同様だが、囲むのにシングルクォートは使えない。バックスラッシュによるエスケープがある。 配列はゼロ個以上の値をコンマで区切って、角かっこでくくることで表現する。例えば以下のように表現する: ["milk", "bread", "eggs"]
オブジェクトはキーと値のペアをコロンで対にして、これらの対をコンマで区切ってゼロ個以上列挙し、全体を波かっこでくくることで表現する。例えば以下のように表現する: {"name": "John Smith", "age": 33}
ここで注意することはキーとして使うデータ型は文字列に限ることである。したがって、 {name: "John Smith", age: 33}
という表記は許されない。この後者の表記はJavaScriptのオブジェクトの表記法としては正しいが、JSONとしては不正な表記である。 プログラム上で生成した文字列をJSONとして扱う場合、ダブルクォーテーション const invalidJSON = "hello";
const validJSON = '"hello"';
JSON.parse(invalidJSON)
// Thrown:
// SyntaxError: Unexpected token h in JSON at position 0
JSON.parse(validJSON)
// 'hello'
// safe JSON generation
const output = JSON.stringify("hello")
output
// '"hello"'
エンコーディング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);
ここでいずれも、 ライブラリJSONは多くのプログラミング言語で利用可能なライブラリなどが提供されている。例えば、ActionScript, C, C++, C#, ColdFusion, Common Lisp, Curl, D, Delphi, E, Elixir, Erlang, Groovy, Haskell, Java, JavaScript (ECMAScript), Lisp, Lua, ML, Objective-C, Objective CAML, Perl, PHP, Python, R, Rebol, Ruby, Scala, Squeakなど。 ただし、テキストファイル、データを交換する手段を持つプログラミング言語であれば自力でパースして入力したり、フォーマット処理で出力は可能である。 JSONPathJSONPath は JSON のクエリ式で、JSON の一部分を示すことが出来る。XML の XPath に対応するものとして Stefan Gössner が2007年に提案し[6]、2024年2月にRFC 9535として仕様が制定された。様々なプログラミング言語でライブラリが実装されている[7]。データベースでは、Oracle Database[8]、Microsoft SQL Server[9]、MySQL[10]、PostgreSQL[11]、MongoDB[12]、RedisJSON[13]など広く採用されている。 例として、下記 JSON に対する、 {
"users": [
{"name": "Foo"},
{"name": "Bar"},
{"name": "Baz"}
]
}
改行区切りのJSON1行を1つのJSONとする改行区切りのJSONが複数の人によって提案されている。仕様は同一である。改行コードは \n を使わなければならないが、JSON の末尾に \r があっても無視されることから \r\n も利用可能である。
Comma-Separated Values よりも柔軟性がある。また、JSONの配列を使うよりも可読性があるうえ、ストリーミングにすることができる。以下は例。 {"ts":"2020-06-18T10:44:12","started":{"pid":45678}}
{"ts":"2020-06-18T10:44:13","logged_in":{"username":"foo"},"connection":{"addr":"1.2.3.4","port":5678}}
{"ts":"2020-06-18T10:44:15","registered":{"username":"bar","email":"bar@example.com"},"connection":{"addr":"2.3.4.5","port":6789}}
{"ts":"2020-06-18T10:44:16","logged_out":{"username":"foo"},"connection":{"addr":"1.2.3.4","port":5678}}
JSON5ECMAScript 5.1 に基づき、人間にとってより読み書きしやすい JSON5 が提案されている。コメントを書けたり、オブジェクトのキーは " が不要だったり、末尾カンマを付けられたりする。拡張子は .json5 、MIMEタイプは application/json5 。[17] // コメント
{a: 1,}
他のデータ記述法との関係
出典
関連項目外部リンク
|