「JavaScript Object Notation」の版間の差分

削除された内容 追加された内容
Ononsgsg (会話 | 投稿記録)
編集の要約なし
編集の要約なし
1行目:
{{ infoboxInfobox file format
| name = JSON
| icon = [[File:JSON vector logo.svg]]
14行目:
| title = Introducing JSON
| publisher = json.org
| accessdate = 2008-04-19
}}</ref> ([[ECMAScript]]) をベースとしている。[[2006年]][[7月]]に RFC 4627 で仕様が規定され、その後、何度か改定され、[[2017年]][[12月14日]]<ref name="LastJSONSpec">[https://www.tbray.org/ongoing/When/201x/2017/12/14/RFC-8259-STD-90 ongoing by Tim Bray · The Last JSON Spec]</ref>に IETF STD 90 および RFC 8259 および ECMA-404 2nd edition が発表された。[[メディアタイプ|MIMEタイプ]]は <code>application/json</code>、[[拡張子]]はjsonとされた。
 
IETF および ECMA の仕様の改定の歴史
* [[2006年]][[7月]] - RFC 4627
* [[2013年]][[3月]] - RFC 7158
* [[2013年]][[10月]] - [http://www.ecma-international.org/publications/standards/Ecma-404-arch.htm ECMA-404 1st edition]
* [[2014年]][[3月]] - RFC 7159
* [[2017年]][[12月14日]]<ref name="LastJSONSpec"/> - RFC 8259 および [https://tools.ietf.org/html/std90 IETF STD 90] および [http://www.ecma-international.org/publications/standards/Ecma-404.htm ECMA-404 2nd edition]
 
JSONはJavaScriptにおけるオブジェクト表記法のサブセットであるが、JavaScriptでの利用に限られたものではない。
 
JSONは単純であるので、特に[[Ajax]]の分野で利用が広がりつつある。JavaScriptでJSONをパースして読み込むには、文字列をJavaScriptのコードとして解釈させる <code>[[eval]]</code> 関数を作用させるだけでよい(ただし、セキュリティ上の問題があるうえ、U+2028 LINE SEPARATOR と U+2029 PARAGRAPH SEPARATOR の扱いがJavaScriptと互換性が無いため、JSON専用のパース関数の <code>JSON.parse()</code> を利用するべきである)。このように、広く普及しているウェブブラウザ搭載言語であるJavaScriptで簡単に読み込めるため、Ajaxの開発者達から注目を浴びることになった。
 
JavaScript言語以外でも、ほとんどの言語においてJSONは単純な処理で書き出しや読み込みができる。また、実装されたプログラミング言語数は[[YAML]]より多いと言われる。そのため、JSONは異なる[[プログラミング言語]]の間でのデータの受渡しには能率的である。[[ウェブアプリケーション]]の場合において、ウェブ[[クライアント (コンピュータ)|クライアント]]でのJavaScriptとのデータの受渡しなどはその最たる活用例と言える。[[プロセス間通信]]、マシン間通信においても、[[結合度|疎結合]]にするため、JSONで情報を受け渡しすることもある。
 
=== JSONの発見 ===
{{仮リンク|ダグラス・クロックフォード([[:|en:|Douglas Crockford]])}}はJavaScriptのプログラマで、JSONを広めた一人だが、「The JSON Saga」と題したプレゼンテーション<ref>[https://www.youtube.com/watch?v=-C-JoyNuQJs Douglas Crockford: The JSON Saga - YouTube]</ref>中で「自分はJSONと名付けたが、考案者ではなく、それ自体は“自然に”存在していたもので、早い例としては1996年には[[Netscape Navigator (ネットスケープコミュニケーションズ)|Netscape Navigator]]でデータ交換用に使われていた。だから“発見した”ということになるのだが、発見したのも自分が最初ではない」といったように述べている。以上のことを縮めて「JavaScriptのオブジェクト表記法からJSONが発見された。」と表現されている場合がある。
 
== 表記方法 ==
JSONで表現する[[データ型]]は以下の通りで、これらを組み合わせてデータを記述する。<code>true</code>, <code>false</code>, <code>null</code> などは全て小文字でなくてはならない。
 
* 数値([[整数]]、[[浮動小数点数]])
* 文字列(バックスラッシュによるエスケープシーケンス記法を含む、ダブルクォーテーションでくくった文字列)
* 真偽値(<code>true</code> <code>false</code>)
* [[配列]](データのシーケンス)
* オブジェクト(順序づけされていないキーと値のペアの集まり。JSONでは[[連想配列]]と等価)
* <code>null</code>
 
数値は[[10進法]]表記に限り、8進、16進法表記などはできない。また[[浮動小数点数]]としては <code>1.0e-10</code> といった[[指数表記]]もできる。
 
文字列は(JSONそれ自体と同じく)[[Unicode]]文字列である。基本的にはJavaScriptの文字列リテラルと同様だが、囲むのにシングルクォートは使えない。バックスラッシュによるエスケープがある。
59行目:
 
=== エンコーディング ===
RFC 8259 より、閉じられたエコシステムで利用する場合を除き、文字コードは [[UTF-8]] でエンコードすることが必須(MUST) (MUST) となっている。ネットワークで JSON を送信する場合は、[[バイトオーダーマーク]]を先頭に付加してはいけない(MUST NOT)(MUST NOT)
 
過去の IETF の仕様では、JSONテキストは[[Unicode]]でエンコードするとされていた (SHALL)。デフォルトのエンコーディングはUTF-8であった。なお、単独の文字列でない限り最初の2文字は必ず[[ASCII]]文字であるので、最初の4バイトを見ることにより、UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BEのいずれの形式でエンコードされているか判別できた。
 
== AjaxにおけるJSONの利用 ==
101行目:
</syntaxhighlight>
 
ここでいずれも、<code>http_request</code> は[[XMLHttpRequest]]オブジェクトであり、それを <code>url</code> にアクセスして返ってきたJSONで記述されたデータを <code>the_object</code> に格納される。いま、XMLHttpRequestを用いて実装をしたが、iframeなどの他の実装方法もある。また、[[JavaScript]][[ライブラリ]]の[[prototype.js]]では[[Hypertext Transfer Protocol|HTTP]]の <code>X-JSON</code> ヘッダを利用して簡単にJSONデータの受渡しができる。
 
== 他のデータ記述法との関係 ==
115行目:
}}</ref>。YAMLにはブロック形式とインライン形式(フロー形式)の表記法があるが、JSONは後者にさらに制約を加えたものと捉えることができる。例えば[[Ruby]]では以下のようにしてJSONをYAMLとして読み込むことができる:
:<syntaxhighlight lang="ruby">the_object = YAML.load('{"name": "John Smith", "age": 33}')</syntaxhighlight>
:YAML1YAML 1.1以前は、配列と連想配列の区切りをそれぞれ <code>, </code> のようにカンマ+スペースの形にすることでJSONの[[上位互換|スーパーセット]]となったが、YAML1YAML 1.2では区切り文字も互換となったため、正常なJSON文書においては公式に完全なスーパーセットとなった。僅かな相違点として、連想配列のキーがユニークであるべきことをJSONではSHOULDレベルで要請するのに対し、YAML1YAML 1.2ではMUSTレベルで要請している<ref>{{cite web
| url = http://www.yaml.org/spec/1.2/spec.html#id2763754
| title = 3.2.1. Representation Graph - YAML Ain’t Markup Language (YAML™) Version 1.2
| publisher = yaml.org
| accessdate = 2013-05-15
142行目:
* [http://www.json.org/ Introducing JSON] {{En icon}}
* [http://www.json.org/json-ja.html JSONの紹介] {{Ja icon}}
* IETF の仕様書
** [https://tools.ietf.org/html/std90 IETF STD 90] および RFC 8259
** 古い廃止された仕様書