(Translated by https://www.hiragana.jp/)
JavaScript Object Notation - Wikipedia

JavaScript Object Notation

データ記述きじゅつ言語げんごの1つ
JSONから転送てんそう

JavaScript Object NotationJSON、ジェイソン)はデータ記述きじゅつ言語げんごの1つである。軽量けいりょうなテキストベースのデータ交換こうかんようフォーマットでありプログラミング言語げんごわず利用りようできる[1]名称めいしょう構文こうぶんJavaScriptにおけるオブジェクト表記ひょうきほう由来ゆらいする。

JSON
拡張子かくちょうし.json
MIMEタイプapplication/json
種別しゅべつData interchange
国際こくさい標準ひょうじゅんIETF STD 90
RFC 8259
ECMA-404 2nd edition
ISO/IEC 21778:2017

特徴とくちょう

編集へんしゅう

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タイプapplication/json拡張子かくちょうしはjsonとされた。

IETFおよびECMAおよびISOの仕様しよう改定かいてい歴史れきし

JSONはJavaScriptにおけるオブジェクト表記ひょうきほうのサブセットであるが、JavaScriptでの利用りようかぎられたものではない。

JSONは単純たんじゅんであるので、とくAjax分野ぶんや利用りようひろがりつつある。JavaScriptでJSONをパースしてむには、文字もじれつをJavaScriptのコードとして解釈かいしゃくさせる eval 関数かんすう作用さようさせるだけでよい(ただし、セキュリティじょう問題もんだいがあるうえ、ECMAScript 2018 まで[4]は U+2028 LINE SEPARATOR と U+2029 PARAGRAPH SEPARATOR のあつかいがJavaScriptと互換ごかんせいいため、JSON専用せんようのパース関数かんすうJSON.parse()利用りようするべきである)。このように、ひろ普及ふきゅうしているウェブブラウザ搭載とうさい言語げんごであるJavaScriptで簡単かんたんめるため、Ajaxの開発かいはつしゃたちから注目ちゅうもくびることになった。

JavaScript言語げんご以外いがいでも、ほとんどの言語げんごにおいてJSONは単純たんじゅん処理しょりしやみができる。そのため、JSONはことなるプログラミング言語げんごあいだでのデータ受渡うけわたしには能率のうりつてきである。ウェブアプリケーション場合ばあいにおいて、ウェブクライアントでのJavaScriptとのデータの受渡うけわたしなどはそのさいたる活用かつようれいえる。プロセスあいだ通信つうしん、マシンあいだ通信つうしんにおいても、うと結合けつごうにするため、JSONで情報じょうほうわたしすることもある。

JSONの発見はっけん

編集へんしゅう

ダグラス・クロックフォード英語えいごばんはJavaScriptのプログラマで、JSONをひろめた一人ひとりだが、「The JSON Saga」とだいしたプレゼンテーション[5]なかで「自分じぶんはJSONと名付なづけたが、考案こうあんしゃではなく、それ自体じたいは“自然しぜんに”存在そんざいしていたもので、はやれいとしては1996ねんにはNetscape Navigatorでデータ交換こうかんよう使つかわれていた。だから“発見はっけんした”ということになるのだが、発見はっけんしたのも自分じぶん最初さいしょではない」といったようにべている。以上いじょうのことをちぢめて「JavaScriptのオブジェクト表記ひょうきほうからJSONが発見はっけんされた。」と表現ひょうげんされている場合ばあいがある。

表記ひょうき方法ほうほう

編集へんしゅう

JSONで表現ひょうげんするデータがた以下いかとおりで、これらをわせてデータを記述きじゅつする[6]true, false, 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としては不正ふせい表記ひょうきである。

プログラムうえ生成せいせいした文字もじれつをJSONとしてあつか場合ばあい、ダブルクォーテーション"ふく文字もじれつ利用りようしなければいけないことに注意ちゅうい必要ひつようである。なぜならコードじょう"文字もじれつ定義ていぎ利用りようされる"であり、生成せいせいされるのはあくまで文字もじれつhelloであって文字もじれつ"hello"ではない。JSONの文字もじれつがた後者こうしゃであると定義ていぎされているので、以下いかのようにエラーを発生はっせいさせる。利用りようにはJSON生成せいせい関数かんすうれい JavaScript: JSON.stringify)を利用りようするほうがより安全あんぜんである。

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);

ここでいずれも、http_request はXMLHttpRequestオブジェクトであり、それを url にアクセスしてかえってきたJSONで記述きじゅつされたデータを the_object格納かくのうされる。いま、XMLHttpRequestをもちいて実装じっそうをしたが、iframeなどのほか実装じっそう方法ほうほうもある。また、JavaScriptライブラリのprototype.jsではHTTPX-JSON ヘッダを利用りようして簡単かんたんにJSONデータの受渡うけわたしができる。

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など。

ただし、テキストファイル、データを交換こうかんする手段しゅだんつプログラミング言語げんごであれば自力じりきでパースして入力にゅうりょくしたり、フォーマット処理しょり出力しゅつりょく可能かのうである。

JSONPath は JSON のクエリしきで、JSON の一部分いちぶぶんしめすことが出来できる。XML の XPath対応たいおうするものとして Stefan Gössner が2007ねん提案ていあん[7]2024ねん2がつRFC 9535 として仕様しよう制定せいていされた。様々さまざまなプログラミング言語げんごでライブラリが実装じっそうされている[8]データベースでは、Oracle Database[9]Microsoft SQL Server[10]MySQL[11]PostgreSQL[12]MongoDB[13]RedisJSON[14]などひろ採用さいようされている。

れいとして、下記かき JSON にたいする、$.users[0:2].name結果けっか["Foo", "Bar"] になる。

{
    "users": [
        {"name": "Foo"},
        {"name": "Bar"},
        {"name": "Baz"}
    ]
}

改行かいぎょう区切くぎりのJSON

編集へんしゅう

1ぎょうを1つのJSONとする改行かいぎょう区切くぎりのJSONが複数ふくすうひとによって提案ていあんされている。仕様しよう同一どういつである。改行かいぎょうコードは \n を使つかわなければならないが、JSON の末尾まつびに \r があっても無視むしされることから \r\n も利用りよう可能かのうである。

  • JSON Lines (JSONL)[15] - 拡張子かくちょうしは .jsonl 、MIMEタイプは application/jsonl
  • Newline delimited JSON (NDJSON)[16]旧称きゅうしょう Line delimited JSON, LDJSON[17])- 拡張子かくちょうしは .ndjson 、MIMEタイプは application/x-ndjson

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}}

ECMAScript 5.1 にもとづき、人間にんげんにとってよりきしやすい JSON5 が提案ていあんされている。コメントをけたり、オブジェクトのキーは " が不要ふようだったり、末尾まつびカンマをけられたりする。拡張子かくちょうしは .json5 、MIMEタイプは application/json5 。[18]

// コメント
{a: 1,}

のデータ記述きじゅつほうとの関係かんけい

編集へんしゅう
XML
JSONはXMLとちがってマークアップ言語げんごではない。ウェブブラウザから利用りようできるというてんでは共通きょうつうしている。また両者りょうしゃとも巨大きょだいバイナリデータをあつか仕組しくみがないことが共通きょうつうしている。
YAML
JSONはYAMLのサブセットとなしてよい[19]。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レベルで要請ようせいしている[20]ため該当がいとうする異常いじょうデータのエラーハンドリングにちがいが可能かのうせいはある。

出典しゅってん

編集へんしゅう
  1. ^ JSON is a lightweight, text-based, language-independent syntax for defining data interchange formats. ECMA-404
  2. ^ Introducing JSON”. json.org. 2008ねん4がつ19にち閲覧えつらん
  3. ^ a b ongoing by Tim Bray · The Last JSON Spec
  4. ^ Subsume JSON a.k.a. JSON ⊂ ECMAScript · V8
  5. ^ Douglas Crockford: The JSON Saga - YouTube
  6. ^ A JSON value can be an object, array, number, string, true, false, or null. ECMA-404
  7. ^ JSONPath - XPath for JSON”. goessner.net. 8 June 2023閲覧えつらん
  8. ^ JSONPath Comparison”. cburgmer.github.io. 10 May 2024閲覧えつらん
  9. ^ JSON Developer's Guide”. Oracle Help Center. 8 June 2023閲覧えつらん
  10. ^ jovanpop-msft. “JSON Path Expressions - SQL Server”. learn.microsoft.com. 8 June 2023閲覧えつらん
  11. ^ MySQL :: MySQL 8.0 Reference Manual :: 11.5 The JSON Data Type”. dev.mysql.com. 8 June 2023閲覧えつらん
  12. ^ PostgreSQL: Documentation: 15: 9.16. JSON Functions and Operators
  13. ^ json-path Output Type — MongoDB Command Line Interface”. mongodb.com. 8 June 2023閲覧えつらん
  14. ^ Path”. Redis. 8 June 2023閲覧えつらん
  15. ^ JSON Lines”. jsonlines.org. 4 July 2024閲覧えつらん
  16. ^ ndjson/ndjson-spec: Specification”. July 4, 2024閲覧えつらん
  17. ^ Update specification_draft2.md · ndjson/ndjson-spec@c658c26
  18. ^ JSON5 – JSON for Humans”. JSON5. 31 May 2023閲覧えつらん
  19. ^ YAML is JSON”. 2009ねん7がつ22にち時点じてんオリジナルよりアーカイブ。2013ねん5がつ15にち閲覧えつらん
  20. ^ 3.2.1. Representation Graph - YAML Ain’t Markup Language (YAML™) Version 1.2”. yaml.org. 2013ねん5がつ15にち閲覧えつらん

関連かんれん項目こうもく

編集へんしゅう

外部がいぶリンク

編集へんしゅう