1. ホーム
  2. ジャバスクリプト

[解決済み】JSONとObject Literal Notationの違いは何ですか?

2022-04-03 22:47:08

質問

JavaScriptのオブジェクトの定義に オブジェクトリテラルノーテーション JSONオブジェクト ?

JavaScriptの本によると、これはオブジェクトを定義するために オブジェクト記法 :

var anObject = {
    property1 : true,
    showMessage : function (msg) { alert(msg) }
};

この場合、なぜJSONオブジェクトではないのでしょうか?引用符を使って定義されていないだけ?

どのように解決するのですか?

まず JSON が実際にそうです。JSONは テキスト XML、CSV、YAMLのような、言語に依存しないデータ交換フォーマットです。

データの保存方法はさまざまですが、テキストファイルに保存してコンピュータが読めるようにするには、何らかの構造に従う必要があります。JSONは、そのような構造を定義する数多くの形式の一つです。

このようなフォーマットは通常、言語に依存しない。つまり、Java、Python、JavaScript、PHPなど、あらゆる言語で処理することができるのだ。

それに対して ジャバスクリプト はプログラミング言語です。もちろん、JavaScriptもデータを定義/記述する方法を提供しますが、その構文はJavaScriptに非常に特化したものです。

逆の例として、Pythonには タプル その構文は (x, y) . JavaScriptには、このようなものはありません。


JSONとJavaScriptのオブジェクトリテラルの構文上の違いを見てみましょう。

JSONには、以下のような構文上の制約があります。

  • 対象物 キー は必ず 文字列 (すなわち、二重引用符で囲まれた文字列です。 " ).
  • 値はどちらか一方である。
    • 文字列
    • 数字
    • (JSON)オブジェクト
    • 配列
    • true
    • false
    • null
  • 重複するキー ( {"foo":"bar","foo":"baz"} JSONの仕様では、特にそのセマンティクスを定義していないため、未定義で実装に依存した結果となります。

JavaScript では、オブジェクトリテラルは

  • 文字列リテラル、数値リテラル、識別子名をキーとします(ES6以降、キーは計算することもできるようになり、さらに別の構文が導入されました)。
  • 値は有効なJavaScript式であれば、関数定義や undefined .
  • 重複するキーは、定義された指定された結果を生成します(ルーズモードでは、後者の定義が前者を置き換える、ストリクトモードではエラーとなる)。

それを知った上で、見ただけで 構文 の2つの理由から、あなたの例はJSONではありません。

  1. キーが文字列(リテラル)でない。それは 識別子名 .
  2. 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のソースコードを書いていて、しかも 文字列 ということは、JSONを扱っていないことになります。データをJSONとして受け取ったかもしれませんが(例:ajax経由やファイルからの読み込み)、あなたやあなたが使っているライブラリがそれをパースしたら、それはもうJSONではありません。


オブジェクトリテラルとJSONが見えるからこそ 類似 というのは、この2つの名前を入れ替えてもよいということではありません。 以下もご参照ください。 JSONオブジェクトというものはありません。 .