JSON

概要

JSON オブジェクトは、値を JavaScript Object Notation (JSON) へ、および JSON を値に変換するメソッドを持ちます。

JavaScript Object Notation

JSON は、オブジェクト、配列、数値、文字列、真偽値、そして null をシリアライズする構文です。これは JavaScript の構文に基づいていますが、JavaScript とは異なります: JavaScript の一部は JSON ではなく、JSON の一部も JavaScript ではありません。

標準オブジェクト、配列の文字表記、JSON の間の主な違いは、JSON オブジェクトのプロパティ名がすべてダブルクォーテーションで括られた文字列でなければならないことと、オブジェクトや配列で末尾のカンマが禁じられていることです。標準的な数値表記と JSON の数値表記の主な違いは、JSON では先行するゼロの付加が禁じられていることと、数値の小数点の後には少なくとも 1 つの数字が続かなければならないことです。標準的な文字列表記と JSON の文字列表記の主な違いは、JSON では文字列内で限られた文字一式だけがエスケープされること、文字列内で特定の制御文字が禁じられること、Unicode の LINE SEPARATOR (U+2028) および PARAGRAPH SEPARATOR (U+2029) が許可されること、そして文字列はダブルクォーテーションで括らなければならないことです。

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 オブジェクトは、JSON の構文解析と値を JSON に変換するメソッドを持ちます。

それは呼び出されたり構築されたりできず、また 2 つのメソッドを除きそれ自身に興味深い機能性はありません。

プロパティ

Object から継承されるプロパティ

メソッド

parse
文字列を JSON として解析し、また任意で作り出された値やそのプロパティを変換し、値を返します。
stringify
指定した値に対応する JSON 文字列を返し、また任意で特定のプロパティのみを含むようにしたり、ユーザ定義の規則によりプロパティの値を置き換えたりします。

ブラウザの互換性

JSON オブジェクトは古いブラウザでサポートされていません。この問題はスクリプトの先頭に以下のコードを挿入して、(Internet Explorer 6 のような) JSON をネイティブにサポートしないブラウザでの JSON オブジェクトの利用を可能にすることで回避できます。

以下のアルゴリズムは、ネイティブな 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 の有名なポリフィルは、JSON2 および JSON3 向けのものがあります。

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

Kangax's compat table に基づきます。

Document Tags and Contributors

Contributors to this page: ethertank, yyss
最終更新者: ethertank,