(JavaScript Object Notation)とは
(
JavaScript Object Notation)は、
データ記述言語の一つであり、軽量なテキストベースのデータ交換フォーマットです。
JavaScriptのオブジェクト表記法に由来する構文を持ち、
プログラミング言語の種類を問わず利用できる点が特徴です。ウェブブラウザやサーバー間でのデータ交換に広く利用され、その汎用性と簡便さから多くの開発者に支持されています。
特徴
は、ECMA-262, revision 3に準拠した
JavaScript(ECMAScript)をベースとしています。その仕様は、
2006年7月にRFC 4627で初めて規定され、その後、何度かの改定を経て、
2017年12月14日にIETF STD 90およびRFC 8259、ECMA-404 2nd editionとして発表されました。MIMEタイプは`application/`、
拡張子は`.`と定義されています。
仕様の変遷
の仕様は、以下の通りに改定されてきました。
2006年7月 - RFC 4627
2013年3月 - RFC 7158
2013年10月 - ECMA-404 1st edition
2014年3月 - RFC 7159
2017年11月30日 - ISO/IEC 21778:2017
2017年12月14日 - RFC 8259 および IETF STD 90 および ECMA-404 2nd edition
の利用
は
JavaScriptのオブジェクト表記法のサブセットとして定義されていますが、
JavaScript以外の様々な
プログラミング言語でもデータの読み書きが可能です。そのため、異なる
プログラミング言語で記述されたシステム間でのデータ交換に広く利用されており、特に
ウェブアプリケーションにおけるサーバーとクライアント間のデータ通信で重要な役割を果たしています。
の発見
を広めた一人であるダグラス・クロックフォード氏は、自身がを考案したのではなく、その概念は以前から存在していたと述べています。
1996年にはNetscape Navigatorでデータ交換に利用されていた例を挙げており、「発見」という言葉を使っています。は、
JavaScriptのオブジェクト表記法から自然に派生した、と言えるでしょう。
で表現できる
データ型は以下の通りです。
オブジェクト:順序付けされていないキーと値のペアの集合(連想配列と同等)
配列:データのシーケンス
数値:整数、浮動小数点数
文字列:ダブルクォーテーションで囲まれた
Unicode文字列(バックスラッシュによるエスケープシーケンスを含む)
真偽値:`true` と `false`
null
数値は10進数のみで、8進数や16進数は利用できません。
浮動小数点数では
指数表記も可能です。文字列は
JavaScriptの文字列リテラルと同様ですが、シングルクォートは使えません。
配列は角括弧`[]`で、オブジェクトは波括弧`{}`で表現します。
注意点
オブジェクトのキーは文字列である必要があります。
JavaScriptのオブジェクト表記では許容されるキーに数値や識別子を使用する記法は、では不正となります。
プログラムで生成した文字列をとして扱う場合、ダブルクォーテーションを含む文字列をエスケープする必要があります。直接文字列を生成するのではなく、`.stringify`などの専用の関数を利用するのが安全です。
エンコーディング
RFC 8259では、特別なケースを除き、
文字コードは
UTF-8で
エンコードすることが必須となっています。ネットワークでを送信する際は、バイト順マーク(BOM)を付加してはいけません。
Ajaxでは、
XMLHttpRequestを使用して形式のデータを非同期に受け取ることが可能です。従来の記法と新しい記法を以下に示します。
javascript
// 古典的な例
http_request.onreadystatechange = function() {
if (http_request.readyState == 4 && http_request.status == 200) {
var the_object = eval('(' + http_request.responseText + ')');
}
}
// 新しい記法
http_request.onload = function(){
if (http_request.status === 200) {
var the_object = .parse(http_request.response);
}
}
ここでは、`http_request`は
XMLHttpRequestオブジェクトで、レスポンスとして得られたデータが`the_object`に格納されます。現在では、セキュリティ上の理由から`eval`ではなく、`.parse`を使用することが推奨されています。
は、多くの
プログラミング言語で利用可能な
ライブラリが提供されています。ActionScript, C,
C++, C#, ColdFusion,
Common Lisp, Curl, D,
Delphi, E, Elixir,
Erlang, Groovy,
Haskell,
Java,
JavaScript, Lisp,
Lua, ML,
Objective-C, Objective CAML,
Perl, PHP,
Python, R, Rebol,
Ruby, Scala,
Squeakなど多岐にわたります。
Path
Pathは、データの一部分を指定するためのクエリ言語です。XMLのXPathに対応するものとして、Stefan Gössner氏が提案しました。RFC 9535として仕様が制定されており、様々な
プログラミング言語で
ライブラリが実装されています。
データベースでは、Oracle Database,
Microsoft SQL Server,
MySQL,
PostgreSQL, MongoDB, Redisなどで採用されています。
改行区切りの
改行区切りは、1行を1つのオブジェクトとして表現する形式です。 Lines (L)やNewline delimited (ND)などが存在します。この形式は、の
配列よりも可読性が高く、
ストリーミング処理に適しています。
5
5は、ECMAScript 5.1に基づき、人間にとってより読み書きしやすいように拡張されたの代替形式です。コメントの記述、オブジェクトのキーをダブルクォーテーションで囲む必要がない、末尾にカンマを付けても良いなどの特徴があります。
他のデータ記述法との関係
XML:はマークアップ言語ではないため、XMLとは異なる性質を持ちます。両者ともウェブブラウザで利用できますが、巨大なバイナリデータを扱う仕組みがない点が共通しています。
YAML:は
YAMLのサブセットと見なすことができます。
YAMLのブロック形式とインライン形式(フロー形式)のうち、はインライン形式に制約を加えたものと捉えられます。
YAML 1.2以降では、は
YAMLの完全なスーパーセットとなっています。
まとめ
は、そのシンプルさと汎用性から、現代のソフトウェア開発において不可欠なデータフォーマットとなっています。
ウェブアプリケーション、API、
データベースなど、様々な場面で活用され、今後もその重要性は増していくでしょう。