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 の違い
JavaScript の型 JSON で異なる点
Object および Array プロパティ名は二重引用符で括った文字列にしなければなりません。また、末尾にカンマを置いてはいけません。
Number 先頭のゼロは禁止されています(JSON.stringify では、ゼロは無視されますが、JSON.parse は SyntaxError をスローします)。また、小数点は少なくとも 1 個の数字の後ろに置かなければなりません。
String

エスケープできる文字は限定されています。禁止されている制御文字があります。Unicode の Line Separator 文字 (U+2028) および Paragraph Separator 文字 (U+2029) は許可されています。文字列は二重引用符で括らなければなりません。JSON.parse() では動作しますが、JavaScript のコードして評価すると SyntaxError が発生する例をご覧ください:

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 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) {
              if (value.hasOwnProperty(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 2017 Draft (ECMA-262)
JSON の定義
ドラフト  

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート (有) 3.5 (1.9.1) 8.0 10.5 4.0
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート (有) (有) 1.0 (1.0) (有) (有) (有)

関連情報

ドキュメントのタグと貢献者

 このページの貢献者: YuichiNukiyama, yyss, fscholz, teoli, ethertank
 最終更新者: YuichiNukiyama,