コンテンツにスキップ

JavaScript Object Notation

出典: フリー百科事典『ウィキペディア(Wikipedia)』
JSON
拡張子.json
MIMEタイプapplication/json
種別Data interchange
国際標準IETF STD 90
RFC 8259
ECMA-404 2nd edition
ISO/IEC 21778:2017

JavaScript Object NotationJSON1[1]JavaScript

[]


JSON使ECMA-262, revision 3JavaScript[2] (ECMAScript) 20067RFC 462720171214[3]IETF STD 90RFC 8259ECMA-404 2nd editionMIME application/jsonjson

IETFECMAISO

20067 - RFC 4627

20133 - RFC 7158

201310 - ECMA-404 1st edition

20143 - RFC 7159

20171130 - ISO/IEC 21778:2017

20171214[3] - RFC 8259  IETF STD 90  ECMA-404 2nd edition

JSONJavaScriptJavaScript

JSONAjaxJavaScriptJSONJavaScript eval ECMAScript 2018 [4] U+2028 LINE SEPARATOR  U+2029 PARAGRAPH SEPARATOR JavaScriptJSON JSON.parse() JavaScriptAjax

JavaScriptJSONJSONJavaScriptJSON

JSON[]


JavaScriptJSONThe JSON Saga[5]JSON1996Netscape Navigator使JavaScriptJSON

[]


JSON[6]true, false, null 

JSON





"

true  false

null

10816 1.0e-10 

JSONUnicodeJavaScript使


["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 XMLHttpRequestiframeJavaScriptprototype.jsHTTP X-JSON JSON

[]


JSONActionScript, 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[]


JSONPath  JSON JSON XML  XPath  Stefan Gössner 2007[7]20242 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[編集]


11JSONJSON \n 使JSON  \r  \r\n 

JSON Lines (JSONL)[15] -  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}}

JSON5[編集]

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]為、該当する異常データのエラーハンドリングに違いが出る可能性はある。

出典[編集]



(一)^ JSON is a lightweight, text-based, language-independent syntax for defining data interchange formats. ECMA-404

(二)^ Introducing JSON.  json.org. 2008419

(三)^ abongoing by Tim Bray · The Last JSON Spec

(四)^ Subsume JSON a.k.a. JSON  ECMAScript · V8

(五)^ Douglas Crockford: The JSON Saga - YouTube

(六)^ A JSON value can be an object, array, number, string, true, false, or null. ECMA-404

(七)^ JSONPath - XPath for JSON. goessner.net. 202368

(八)^ JSONPath Comparison. cburgmer.github.io. 2024510

(九)^ JSON Developer's Guide. Oracle Help Center. 202368

(十)^ jovanpop-msft. JSON Path Expressions - SQL Server. learn.microsoft.com. 202368

(11)^ MySQL :: MySQL 8.0 Reference Manual :: 11.5 The JSON Data Type. dev.mysql.com. 202368

(12)^ PostgreSQL: Documentation: 15: 9.16. JSON Functions and Operators

(13)^ json-path Output Type  MongoDB Command Line Interface. mongodb.com. 202368

(14)^ Path. Redis. 202368

(15)^ JSON Lines

(16)^ ndjson

(17)^ Update specification_draft2.md · ndjson/ndjson-spec@c658c26

(18)^ JSON5  JSON for Humans. JSON5. 2023531

(19)^ YAML is JSON. 20097222013515

(20)^ 3.2.1. Representation Graph - YAML Aint Markup Language (YAML) Version 1.2.  yaml.org. 2013515

関連項目[編集]

外部リンク[編集]