最初にJSONが実際に何であるかを明確にしましょう。JSON は、XML、CSV、または YAML によく似た、言語に依存しないテキスト形式のデータ交換形式です。
データはさまざまな方法で保存できますが、テキスト ファイルに保存してコンピューターで読み取り可能にする場合は、何らかの構造に従う必要があります。JSON は、このような構造を定義する多くの形式の 1 つです。
このような形式は通常、言語に依存しません。つまり、Java、Python、JavaScript、PHP などで処理できます。
対照的に、JavaScriptはプログラミング言語です。もちろん、JavaScript もデータを定義/記述する方法を提供しますが、構文は JavaScript に非常に固有のものです。
反例として、Python にはタプルの概念があり、その構文は(x, y)
です。JavaScript にはこのようなものはありません。
JSON と JavaScript のオブジェクト リテラルの構文上の違いを見てみましょう。
JSON には、次の構文上の制約があります。
- オブジェクトキーは文字列でなければなりません(つまり、二重引用符で囲まれた文字シーケンス
"
)。
- 値は次のいずれかです。
- 文字列
- 数
- (JSON) オブジェクト
- 配列
true
false
null
- 重複キー (
{"foo":"bar","foo":"baz"}
) は未定義の実装固有の結果を生成します。JSON 仕様は、具体的にはセマンティクスを定義していません
JavaScript では、オブジェクト リテラルは
- キーとしての文字列リテラル、数値リテラル、または識別子名 (ES6 以降、キーも計算できるようになり、さらに別の構文が導入されました)。
- 値は、関数定義や
undefined
.
- 重複キーは、定義済みの指定された結果を生成します (ルース モードでは、後者の定義が前者を置き換えます。厳密モードでは、エラーになります)。
構文を見るだけでわかるように、次の 2 つの理由により、例は JSON ではありません。
- キーは文字列 (リテラル) ではありません。それらは識別子名です。
- 関数を値として「JSON オブジェクト」に割り当てることはできません (JSON では関数の構文が定義されていないため)。
しかし、最も重要なことは、私の説明を最初から繰り返すことです。あなたは JavaScript コンテキストにいます。JavaScript オブジェクトを定義します。もしあれば、「JSON オブジェクト」は文字列にのみ含めることができます:
var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
var json = '{"foo": 452}'; // creates a string containing JSON
つまり、JavaScript ソース コードを書いていて、stringを扱っていない場合は、JSON を扱っていません。データを JSON として (たとえば、ajax やファイルからの読み取りを介して) 受け取ったかもしれませんが、ユーザーまたは使用しているライブラリがそれを解析すると、それはもう JSON ではありません。
オブジェクト リテラルと JSON が似ているという理由だけで、それらを同じ名前にできるわけではありません。「JSON オブジェクト」などというものはありませんも参照してください。