JSON オブジェクトは、 JavaScript Object Notation (JSON) をパースするメソッドや、値を JSON に変換するメソッドを持ちます。これは呼び出しや構築ができず、また2つのメソッドを除きそれ自身に興味深い機能性はありません。
説明
JavaScript Object Notation
JSON は、オブジェクト、配列、数値、文字列、真偽値、そして null をシリアライズする構文です。これは JavaScript の構文に基づいていますが、JavaScript とは異なります。ある JavaScript が JSON であるのではなく、またある JSON が JavaScript でもありません。JSON: The JavaScript subset that isn't もご覧ください。
| JavaScript の型 | JSON で異なる点 |
|---|---|
| Object および Array | プロパティ名は二重引用符で括った文字列にしなければなりません。また、末尾にカンマを置いてはいけません。 |
| Number | 先頭のゼロは禁止されています(JSON.stringify では、ゼロは無視されますが、JSON.parse は SyntaxError をスローします)。また、小数点は少なくとも 1 個の数字の後ろに置かなければなりません。 |
| String |
エスケープできる文字は限定されています。禁止されている制御文字があります。Unicode の Line Separator 文字 (U+2028) および Paragraph Separator 文字 (U+2029) は許可されています。文字列は二重引用符で括らなければなりません。 var code = '"\u2028\u2029"'; JSON.parse(code); // 成功 eval(code); // 失敗 |
JSON の完全な構文は以下のとおりです:
JSON = null
or true or false
or JSONNumber
or JSONString
or JSONObject
or JSONArray
JSONNumber = - PositiveNumber
or PositiveNumber
PositiveNumber = DecimalNumber
or DecimalNumber . Digits
or DecimalNumber . Digits ExponentPart
or DecimalNumber ExponentPart
DecimalNumber = 0
or OneToNine Digits
ExponentPart = e Exponent
or E Exponent
Exponent = Digits
or + Digits
or - Digits
Digits = Digit
or Digits Digit
Digit = 0 through 9
OneToNine = 1 through 9
JSONString = ""
or " StringCharacters "
StringCharacters = StringCharacter
or StringCharacters StringCharacter
StringCharacter = any character
except " or \ or U+0000 through U+001F
or EscapeSequence
EscapeSequence = \" or \/ or \\ or \b or \f or \n or \r or \t
or \u HexDigit HexDigit HexDigit HexDigit
HexDigit = 0 through 9
or A through F
or a through f
JSONObject = { }
or { Members }
Members = JSONString : JSON
or Members , JSONString : JSON
JSONArray = [ ]
or [ ArrayElements ]
ArrayElements = JSON
or ArrayElements , JSON
JSONNumber (数値に空白を含んではいけません) や JSONString (一致する文字であると解釈されるか、エラーが発生します) の内部を除く、任意の場所に余分な空白文字を置くことができます。ホワイトスペースとして有効な文字はタブ (U+0009)、キャリッジリターン (U+000D)、ラインフィード (U+000A)、空白 (U+0020) のみです。
メソッド
JSON.parse()- 文字列を JSON として解析、また必要に応じて作成した値やそのプロパティを変換して、値を返します。
JSON.stringify()- 指定した値に対応する JSON 文字列を返します。また任意で特定のプロパティのみを含むようにしたり、ユーザ定義の規則によりプロパティの値を置き換えたりします。
ポリフィル
JSON オブジェクトは古いブラウザでサポートされていません。この問題はスクリプトの先頭に以下のコードを挿入して、(Internet Explorer 6 のような) JSON をネイティブにサポートしないブラウザでの JSON オブジェクトの利用を可能にすることで回避できます。
以下のアルゴリズムは、ネイティブな JSON オブジェクトを模倣するものです:
if (!window.JSON) {
window.JSON = {
parse: function(sJSON) { return eval('(' + sJSON + ')'); },
stringify: (function () {
var toString = Object.prototype.toString;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var isArray = Array.isArray || function (a) { return toString.call(a) === '[object Array]'; };
var escMap = {'"': '\\"', '\\': '\\\\', '\b': '\\b', '\f': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t'};
var escFunc = function (m) { return escMap[m] || '\\u' + (m.charCodeAt(0) + 0x10000).toString(16).substr(1); };
var escRE = /[\\"\u0000-\u001F\u2028\u2029]/g;
return function stringify(value) {
if (value == null) {
return 'null';
} else if (typeof value === 'number') {
return isFinite(value) ? value.toString() : 'null';
} else if (typeof value === 'boolean') {
return value.toString();
} else if (typeof value === 'object') {
if (typeof value.toJSON === 'function') {
return stringify(value.toJSON());
} else if (isArray(value)) {
var res = '[';
for (var i = 0; i < value.length; i++)
res += (i ? ', ' : '') + stringify(value[i]);
return res + ']';
} else if (toString.call(value) === '[object Object]') {
var tmp = [];
for (var k in value) {
// in case "hasOwnProperty" has been shadowed
if (hasOwnProperty.call(value, k))
tmp.push(stringify(k) + ': ' + stringify(value[k]));
}
return '{' + tmp.join(', ') + '}';
}
}
return '"' + value.toString().replace(escRE, escFunc) + '"';
};
})()
};
}
より複雑な、JSON の有名なポリフィルとして、JSON2 および JSON3 があります。
仕様
| 仕様書 | 策定状況 | コメント |
|---|---|---|
| ECMAScript 5.1 (ECMA-262) JSON の定義 |
標準 | 最初期の定義 |
| ECMAScript 2015 (6th Edition, ECMA-262) JSON の定義 |
標準 | |
| ECMAScript Latest Draft (ECMA-262) JSON の定義 |
ドラフト |
ブラウザ実装状況
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
JSON | Chrome 完全対応 3 | Edge 完全対応 12 | Firefox 完全対応 3.5 | IE 完全対応 8 | Opera 完全対応 10.5 | Safari 完全対応 4 | WebView Android 完全対応 ≤37 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 11 | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
| JavaScript is a superset of JSON | Chrome 完全対応 66 | Edge 未対応 なし | Firefox 完全対応 62 | IE 未対応 なし | Opera 完全対応 53 | Safari 完全対応 あり | WebView Android 完全対応 66 | Chrome Android 完全対応 66 | Firefox Android 完全対応 62 | Opera Android 完全対応 47 | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 9.0 | nodejs 完全対応 10.0.0 |
parse | Chrome 完全対応 3 | Edge 完全対応 12 | Firefox 完全対応 3.5 | IE 完全対応 8 | Opera 完全対応 10.5 | Safari 完全対応 4 | WebView Android 完全対応 ≤37 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 11 | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
stringify | Chrome 完全対応 3 | Edge 完全対応 12 | Firefox 完全対応 3.5 | IE 完全対応 8 | Opera 完全対応 10.5 | Safari 完全対応 4 | WebView Android 完全対応 ≤37 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 11 | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応