JSON

JSONオブジェクトは、JavaScript Object Notation(JSON)の解析と、JSONへの値の変換を行うメソッドを含みます。 呼び出されること、またはコンストラクタされることは出来ず、 2つのメソッドプロパティがあるだけで、他にこのオブジェクトに何らかの機能があるわけではありません。

説明

JavaScript Object Notation

JSONはオブジェクト、配列、数値、文字列、真偽値、nullをシリアライズするための文法です。 JavaScriptの文法が基になっていますが、JavaScriptの一部はJSONでは無く、JSONの一部はJavaScriptでは無いことは明白です。 JSON: The JavaScript subset that isn'tも、参照してみてください。

JavaScriptとJSONの相違点
JavaScript
の型
JSONとの違い
オブジェクトと配列 プロパティ名は、ダブルクォーテーションで囲われた文字列で無ければなりません。 また、末尾のカンマが禁止されています。
数値 先頭の0は禁止されており、小数点は少なくとも1桁を必要とします。
文字列

限られた文字の集まりのみエスケープすることが可能で、 特定の制御文字は禁止されています。 Unicodeの改行(U+2028)と改段落(U+2029)文字は許可され、 文字列はダブルクォーテーションで囲わなければなりません。 下記のサンプルで、JSON.parseの部分では正常に動作し、 JavaScriptのコードとして評価する(eval())の部分で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を除きどこにでも置くことが出来ます。 (JSONNumber:数値に空白を含んではいけません JSONString:文字列に対応する文字であると解釈されたり、エラーの原因になるかもしれません。) タブ文字(U+0009)、キャリッジリターン(U+000D)、スペース(U+0020)の文字だけが、 正式な空白文字となります。

メソッド

  • JSON.parse()

    このメソッドは文字列をJSONとして解析し、解析によって任意で値に変換します。

  • JSON.stringify()

    値をJSONに変換します。任意で値の置換を行う関数を指定、または

Polyfill

JSONオブジェクトは古いブラウザではサポートされません。 ネイティブでサポートされないInternet Explorer 6や7のような実装に対して、 下記のコードをスクリプトの先頭に配置することで、この問題を回避することが出来ます。

下記のアルゴリズムは、ネイティブのJSONオブジェクトを模倣したものです。

if (!window.JSON) {
  window.JSON = {
    parse: function (sJSON) { return eval("(" + sJSON + ")"); },
    stringify: function (vContent) {
      if (vContent instanceof Object) {
        var sOutput = "";
        if (vContent.constructor === Array) {
          for (var nId = 0; nId < vContent.length; sOutput += this.stringify(vContent[nId]) + ",", nId++);
            return "[" + sOutput.substr(0, sOutput.length - 1) + "]";
        }
        if (vContent.toString !== Object.prototype.toString) {
          return "\"" + vContent.toString().replace(/"/g, "\\$&") + "\"";
        }
        for (var sProp in vContent) {
          sOutput += "\"" + sProp.replace(/"/g, "\\$&") + "\":" + this.stringify(vContent[sProp]) + ",";
        }
        return "{" + sOutput.substr(0, sOutput.length - 1) + "}";
     }
     return typeof vContent === "string" ? "\"" + vContent.replace(/"/g, "\\$&") + "\"" : String(vContent);
    }
  };
}

JSONオブジェクトには、より複雑で有名な下記のPolyfillが存在します。

仕様

ブラウザ互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本 ◯ 3.5 (1.9.1) 8.0 10.5 4.0
モバイル
機能 Android Chrome for
Android
Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本 ◯ 1.0 (1.0) ◯ ◯ ◯ ◯

Kangax氏の互換性テーブルを基に

関連項目

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。