JSON
JSON
オブジェクトは、 JavaScript Object
Notation (JSON) を解釈するメソッドや、値を JSON に変換するメソッドを持ちます。これは呼び出しや構築をすることができず、また 2 つのメソッドプロパティを除いて、これ自身に興味深い機能性はありません。
解説
JavaScript と JSON の違い
JSON は、オブジェクト、配列、数値、文字列、論理値、そして null
をシリアライズする構文です。これは JavaScript の構文に基づいていますが、区別されるものです。JavaScript ならば JSON であるというわけではありません。
- オブジェクトと配列
-
プロパティ名は二重引用符で括った文字列にしなければなりません。末尾のカンマを置いてはいけません。
- 数値
-
先頭にゼロを置くことは禁止されています。また、小数点は 1 桁以上の数字の後ろに置かなければなりません。
NaN
とInfinity
には対応していません。 - あらゆる JSON のテキストは有効な JavaScript の式です...
-
...ただし、proposal to make all JSON text valid ECMA-262 を実装した JavaScript エンジンのみでの話です。この提案を実装していないエンジンでは、 U+2028 LINE SEPARATOR と U+2029 PARAGRAPH SEPARATOR は JSON の文字列リテラルとプロパティのキーでは許されますが、これらの機能を JavaScript 文字列リテラルの中で使用すると
SyntaxError
になります。
JSON.parse()
が文字列を JSON として解釈し、eval
が文字列を JavaScript として実行するこの例を考えてみてください。
js
let code = '"\u2028\u2029"';
JSON.parse(code); // どのエンジンでも "\u2028\u2029" と評価される
eval(code); // 古いエンジンでは SyntaxError が発生する
他の違いとしては、二重引用符で囲まれた文字列のみを許可していることや、 undefined
やコメントの規定がないことなどが挙げられます。 JSON に基づいたより人間に優しい設定フォーマットを使いたい場合、 Babel コンパイラーによって使われる JSON5 と、より一般的に使われる YAML があります。
JSON の完全な構文
有効な JSON の構文は、ABNF で表現された以下の文法で公式に定義されています。これは IETF の JSON 標準 (RFC) からコピーしたものです。
JSON-text = object / array begin-array = ws %x5B ws ; [ left square bracket begin-object = ws %x7B ws ; { left curly bracket end-array = ws %x5D ws ; ] right square bracket end-object = ws %x7D ws ; } right curly bracket name-separator = ws %x3A ws ; : colon value-separator = ws %x2C ws ; , comma ws = *( %x20 / ; Space %x09 / ; Horizontal tab %x0A / ; Line feed or New line %x0D ; Carriage return ) value = false / null / true / object / array / number / string false = %x66.61.6c.73.65 ; false null = %x6e.75.6c.6c ; null true = %x74.72.75.65 ; true object = begin-object [ member *( value-separator member ) ] end-object member = string name-separator value array = begin-array [ value *( value-separator value ) ] end-array number = [ minus ] int [ frac ] [ exp ] decimal-point = %x2E ; . digit1-9 = %x31-39 ; 1-9 e = %x65 / %x45 ; e E exp = e [ minus / plus ] 1*DIGIT frac = decimal-point 1*DIGIT int = zero / ( digit1-9 *DIGIT ) minus = %x2D ; - plus = %x2B ; + zero = %x30 ; 0 string = quotation-mark *char quotation-mark char = unescaped / escape ( %x22 / ; " quotation mark U+0022 %x5C / ; \ reverse solidus U+005C %x2F / ; / solidus U+002F %x62 / ; b backspace U+0008 %x66 / ; f form feed U+000C %x6E / ; n line feed U+000A %x72 / ; r carriage return U+000D %x74 / ; t tab U+0009 %x75 4HEXDIG ) ; uXXXX U+XXXX escape = %x5C ; \ quotation-mark = %x22 ; " unescaped = %x20-21 / %x23-5B / %x5D-10FFFF HEXDIG = DIGIT / %x41-46 / %x61-66 ; 0-9, A-F, or a-f ; HEXDIG equivalent to HEXDIG rule in [RFC5234] DIGIT = %x30-39 ; 0-9 ; DIGIT equivalent to DIGIT rule in [RFC5234]
重要でないホワイトスペースは、基本的に任意の場所に置くことができますが、 JSONNumber
(数値に空白を含んではいけません) や JSONString
(対応する文字であると解釈されるか、エラーが発生します) の内部を除きます。ホワイトスペースとして有効な文字はタブ文字 (U+0009)、キャリッジリターン (U+000D)、ラインフィード (U+000A)、空白 (U+0020) のみです。
静的メソッド
JSON.parse(text[, reviver])
-
文字列
text
を JSON として解析し、オプションで生成された値とそのプロパティを変換し、値を返します。 JavaScript と JSON の違いに関連するものを含め、 JSON の構文に違反するとSyntaxError
が発生します。reviver
オプションは、replacer
が他のデータ型の代用として使用したものを解釈することができます。 JSON.stringify(value[, replacer[, space]])
-
指定した値に対応する JSON 文字列を返します。オプションで、特定のプロパティのみを含むか、ユーザー定義の方法でプロパティ値を置き換えることもできます。既定では、すべての
undefined
のインスタンスはnull
に置き換えられ、その他の対応していないネイティブデータ型は打ち切られます。replacer
オプションでは、他の動作を指定することができます。
例
JSON の例
json
{
"browsers": {
"firefox": {
"name": "Firefox",
"pref_url": "about:config",
"releases": {
"1": {
"release_date": "2004-11-09",
"status": "retired",
"engine": "Gecko",
"engine_version": "1.7"
}
}
}
}
}
仕様書
Specification |
---|
ECMAScript Language Specification # sec-json-object |
ブラウザーの互換性
BCD tables only load in the browser