[解決済み】JSONとObject Literal Notationの違いは何ですか?
質問
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ではありません。
- キーが文字列(リテラル)でない。それは 識別子名 .
- 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オブジェクトというものはありません。 .
関連
-
[解決済み】webpack-dev-serverにリモート接続すると、「Invalid Host header」というメッセージが表示されます。
-
[解決済み] 正しいJSONコンテンツタイプは何ですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] Bowerとnpmの違いは何ですか?
-
[解決済み】JavaScript版sleep()とは?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Facebook Graph API のクエリで with=location を使用すると "Uncaught (in promise) undefined" というエラーが発生する。
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】NodeJS "ESモジュールをロードするためにインポートを使用する必要があります。"
-
[解決済み】ある要素を別の要素に移動させるには?
-
[解決済み】Uncaught ReferenceError。Reactが定義されていない
-
[解決済み】未定義のプロパティ 'bind' を読み込めない。React.js【重複あり
-
[解決済み】SyntaxError: ChromeのJavascriptコンソールでUnexpected Identifierが発生する。
-
[解決済み】getElementByIdはnullを返す?[クローズド]
-
[解決済み】Syntax error: JavaScriptの不正なreturnステートメント
-
[解決済み] [Solved] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングする