--- title: JSON slug: Web/JavaScript/Reference/Global_Objects/JSON tags: - JSON - JavaScript - Namespace - Object - Reference - 名前空間 translation_of: Web/JavaScript/Reference/Global_Objects/JSON ---
{{JSRef}}

JSON オブジェクトは、 JavaScript Object Notation ({{glossary("JSON")}}) をパースするメソッドや、値を JSON に変換するメソッドを持ちます。これは呼び出しや構築をすることができず、また2つのメソッドプロパティを除いて、それ自身に興味深い機能性はありません。

JavaScript と JSON の違い

JSON は、オブジェクト、配列、数値、文字列、真偽値、そして {{jsxref("null")}} をシリアライズする構文です。これは JavaScript の構文に基づいていますが、区別されるものです。ある JavaScript が JSON であるわけではありません

Objects と Arrays
プロパティ名は二重引用符で括った文字列にしなければなりません。また、末尾にカンマを置いてはいけません。
Numbers
先頭にゼロを置くことは禁止されています。また、小数点は1桁以上の数字の後ろに置かなければなりません。 NaNInfinity には対応していません。
あらゆる JSON のテキストは有効な JavaScript の式です...
...ただし、 proposal to make all JSON text valid ECMA-262 を実装した JavaScript エンジンのみでの話です。この提案を実装していないエンジンでは、 U+2028 LINE SEPARATOR と U+2029 PARAGRAPH SEPARATOR は JSON の文字列リテラルとプロパティのキーでは許されますが、これらの機能を JavaScript 文字列リテラルの中で使用すると {{jsxref("SyntaxError")}} になります。

{{jsxref("JSON.parse()")}} が文字列を JSON として解釈し、 {{jsxref("eval")}} が文字列を JavaScript として実行するこの例を考えてみてください。

let code = '"\u2028\u2029"'
JSON.parse(code)  // どのエンジンでも "\u2028\u2029" と評価される
eval(code)        // 古いエンジンでは SyntaxError が発生する

他の違いとしては、二重引用符で囲まれた文字列のみを許可していることや、 {{jsxref("undefined")}} やコメントの規定がないことなどが挙げられます。 JSON に基づいたより人間に優しい設定フォーマットを使いたい場合、 Babel コンパイラーによって使われる JSON5 と、より一般的に使われる YAML があります。

JSON の完全な構文

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

重要でない{{glossary("whitespace", "ホワイトスペース")}}は、基本的に任意の場所に置くことができますが、 JSONNumber (数値に空白を含んではいけません) や JSONString (一致する文字であると解釈されるか、エラーが発生します) の内部を除きます。ホワイトスペースとして有効な文字はタブ文字 (U+0009)、キャリッジリターン (U+000D)、ラインフィード (U+000A)、空白 (U+0020) のみです。

静的メソッド

{{jsxref("JSON.parse()", "JSON.parse(text[, reviver])")}}
文字列 text を JSON として解析し、オプションで生成された値とそのプロパティを変換し、値を返します。 JavaScript と JSON の違いに関連するものを含め、 JSON の構文に違反すると {{jsxref("SyntaxError")}} が発生します。 reviver オプションを使用すると、他のデータ型を表すために使われた replacer を解釈することができます。
{{jsxref("JSON.stringify()", "JSON.stringify(value[, replacer[, space]])")}}
指定した値に対応する JSON 文字列を返します。オプションで、特定のプロパティのみを含むか、ユーザー定義の方法でプロパティ値を置き換えることもできます。既定では、すべての {{jsxref("undefined")}} のインスタンスは {{jsxref("null")}} に置き換えられ、その他の対応していないネイティブデータ型は打ち切られます。 replacer オプションでは、他の動作を指定することができます。

JSONの例

{
  "browsers": {
    "firefox": {
      "name": "Firefox",
      "pref_url": "about:config",
      "releases": {
        "1": {
          "release_date": "2004-11-09",
          "status": "retired",
          "engine": "Gecko",
          "engine_version": "1.7"
        }
      }
    }
  }
}

仕様書

仕様書
{{SpecName('ESDraft', '#sec-json-object', 'JSON')}}

ブラウザーの互換性

{{Compat("javascript.builtins.JSON")}}

関連情報

ツール