質問

を使用して定義された JavaScript オブジェクトの主な違いは何ですか。 オブジェクトリテラル表記法 そして JSONオブジェクト?

JavaScript の本によると、これは次のように定義されたオブジェクトであると書かれています。 オブジェクト表記法:

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

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

役に立ちましたか?

解決

最初に何を明確にしましょう JSON 実際には。 jsonはaです テキスト, 、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ではありません。

  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が見えるからです 似ている, 、それはあなたがそれらを交換可能に名前を付けることができるという意味ではありません。 参照してください 「JSONオブジェクト」のようなものはありません.

他のヒント

JSON 以下を含む、はるかに限られた構文があります

  • キー値を引用する必要があります
  • 文字列は引用する必要があります " そしてそうではありません '
  • あなたはより限られた範囲の値を持っています(例:機能が許可されていません)

「JSONオブジェクト」のようなものは本当にありません。

JSON仕様は、データを文字列としてエンコードするための構文です。人々が「JSONオブジェクト」(JavaScript)と呼ぶものは、実際には有効なJSON文字列から(おそらく)脱線化された普通のJavaScriptオブジェクトであり、有効なJSON文字列として簡単に再整理できます。これは通常、データのみが含まれていることを意味します(関数ではありません)。また、JSONには日付のタイプがないため、日付がないことも意味します(おそらくJSONについて最も痛みを伴うものです。)

さらに、(サイドラント...)人々が「JSONオブジェクト」について話すとき、彼らはほとんど常にトップレベルに「巻き毛のブレース」を持つデータを意味します。これは、JavaScriptオブジェクトにうまく対応します。ただし、JSONスペックでは、JSON文字列のトップレベルに単一の「巻き毛のブレース」オブジェクトがあることを必要としません。トップレベルにリストを持っているか、単一の値だけを持つことは完全に有効です。したがって、すべての「JSONオブジェクト」は有効なJSONに対応していますが、すべての有効なJSON文字列が「JSONオブジェクト」と呼ばれるものに対応するわけではありません! (文字列はリストまたは原子値を表すことができるため)

によると JavascriptのJson,

jsonはaです サブセット JavaScriptのオブジェクトリテラル表記の。

言い換えれば、有効なJSONは有効なJavaScriptオブジェクトリテラル表記でもありますが、必ずしもその逆ではありません。

読むことに加えて ドキュメンテーション, 、@Filix Kingが提案したように、私は JSonlint Online JSON VALIBATOR. 。それが、JSONオブジェクトのキーが文字列でなければならないことを学んだ方法です。

🔫 JSON: :XMLの脂肪のない代替品

JSONは、分散アプリケーションとサービスを作成するのがはるかに簡単になったことを発見した人々によって広く採用されています。 JSONの公式インターネットメディアタイプはそうです application/json RFC 4627. 。 JSONファイル名は拡張機能を使用します .json.


►JavaScriptオブジェクト表記(JSON)は、軽量のテキストベースの言語に依存しないデータインターチェンジ形式です。 JSONは、プログラミング言語で記述されたアプリケーション間でデータを交換するために使用されています。

JSONオブジェクトは、JSONテキストを解析および構築するために使用される2つの関数、解析とStringifyを含む単一のオブジェクトです。

  • JSON.Stringifyは、次のJSON文法に準拠する文字列を生成します。
  • Json.Parseは、JSON文法に準拠する文字列を受け入れます。

Parsejsonメソッドはに含まれます Fourth Edition of ECMAScript. 。それまでの間、JavaScriptの実装はjson.orgで入手できます。

var objLiteral = {foo: 42}; // JavaScript Object
console.log('Object Literal : ', objLiteral ); // Object {foo: 42}foo: 42__proto__: Object

// This is a JSON String, like what you'd get back from an AJAX request.
var jsonString = '{"foo": 452}';
console.log('JOSN String : ', jsonString ); // {"foo": 452}

// This is how you deserialize that JSON String into an Object.
var serverResposnceObject = JSON.parse( jsonString );
console.log('Converting Ajax response to JavaScript Object : ', serverResposnceObject); // Object {foo: 42}foo: 42 __proto__: Object

// And this is how you serialize an Object into a JSON String.
var serverRequestJSON = JSON.stringify( objLiteral );
console.log('Reqesting server with JSON Data : ', serverRequestJSON); // '{"foo": 452}'

JSONはJavaScriptのサブセットです。 JavaScript ECMAScriptプログラミング言語標準から派生しました。


►ECMascript

ECMAScriptは、世界で最も広く使用されている汎用プログラミング言語の1つに成長しました。これは、Webブラウザーに埋め込まれた言語として最もよく知られていますが、サーバーおよび組み込みアプリケーションにも広く採用されています。 ECMAScriptは、いくつかの発生テクノロジーに基づいています。 JavaScript (Netscape Communications))および JScript (マイクロソフト)。). 1994年以前は、ECMAは1994年以降、組織がグローバルになった後、「欧州コンピューターメーカー協会」として知られていましたが、「商標」「ECMA」は歴史的な理由で保持されていました。

ecmascriptは言語ですが、javascript、jscript、さらにはactionscriptが呼ばれます "Dialects".

方言は同じ言語から派生しています。彼らは同じ言語から派生しているため、互いに非常に似ていますが、いくつかの変更を受けました。方言は、言語自体のバリエーションです。単一の言語から派生しています。

  • SQL言語 - Hibernate mysql方言、Oracle方言、いくつかの変更または追加機能がある。

ユーザーのブラウザとコンピューターに関する情報。

navigator.appName // "Netscape"

ECMAScriptは、JavaScriptの基礎を形成するスクリプト言語です。 JavaScript language resources.

ECMA-262 Links
Initial Edition, June 1997 PDF.
2nd Edition, August 1998 PDF.
3rd Edition, December 1999 PDF.
5th Edition, December 2009 PDF.
5.1 Edition, June 2011 HTML.
6th Edition, June 2015 HTML.
7ᵗʰ Edition, June 2016 HTML.
8th edition, June 2017 HTML.
9th Edition, 2018 HTML.

ノート " 第4版 ECMAScriptではありません 作品が不完全であったために公開されました.


JSONは、構造化されたデータのポータブル表現のための小さなフォーマットルールセットを定義しています。

  1. ►キー値を引用する必要があり、キーの文字列のみが許可されます。文字列以外を使用すると、文字列に変換されます。ただし、文字列以外のキーを使用することはお勧めしません。このような例を確認してください - { 'key':'val' } 以上 RFC 4627 - jsonformatter

    var storage = {
      0 : null,
      1 : "Hello"
    };
    console.log( storage[1] ); // Hello
    console.log( JSON.stringify( storage ) ); // {"0":null,"1":"Hello","2":"world!"}
    
    var objLiteral = {'key1':'val1'};
        var arr = [10, 20], arr2 = [ 'Yash', 'Sam' ];
        var obj = { k: 'v' }, obj2 = { k2: 'v2' };
        var fun = function keyFun() {} ;
    
    objLiteral[ arr ] = 'ArrayVal';     objLiteral[ arr2 ] = 'OverridenArrayVal';
    objLiteral[ obj ] = 'ObjectVal';    objLiteral[ obj2 ] = 'OverridenObjectVal';
    objLiteral[ fun ] = 'FunctionVal';
    
    console.log( objLiteral );
    // Object {key1: "val1", 10,20: "ArrayVal", Yash,Sam: "OverridenArrayVal", [object Object]: "OverridenObjectVal", function keyFun() {}: "FunctionVal"}
    console.log( JSON.stringify( objLiteral ) );
    // {"key1":"val1","10,20":"ArrayVal","Yash,Sam":"OverridenArrayVal","[object Object]":"OverridenObjectVal","function keyFun() {}":"FunctionVal"}
    console.log( JSON.parse( JSON.stringify( objLiteral ) ) );
    // Object {key1: "val1", 10,20: "ArrayVal", Yash,Sam: "OverridenArrayVal", [object Object]: "OverridenObjectVal", function keyFun() {}: "FunctionVal"}
    
    console.log('Accessing Array  Val : ', objLiteral[ [10,20] ] );
    console.log('Accessing Object Val : ', objLiteral[ '[object Object]' ] );
    console.log('Accessing Function Val : ', objLiteral[ 'function keyFun() {}' ] );
    
  2. ►JSON文字列は、「ではなく」で引用する必要があります。文字列はCまたはJava文字列に非常によく似ています。 文字列は二重引用符で包む必要があります。

    • リテラルは、文字通りスクリプトで提供する変数ではなく固定値です。
    • 文字列は、ほとんどのプログラミング言語で使用されている同じ表記である、バックスラッシュエスケープメントで引用符で包まれたゼロ以上の文字のシーケンスです。
      • 🔫 - 特別なシンボルは文字列で許可されていますが、使用するように推奨されません。
      • " - 特殊文字は逃げることができます。しかし、脱出するように推奨されることはありません( ')単一引用符。厳密なモードでは、スローとエラーが発生します - SyntaxError: Unexpected token ' in JSON

    このコードを確認してください { "Hai\" \n Team 🔫":5, "Bye \'": 7 } オンラインjson edtionsを超えて。 ModesnotStrict,Strinct.

    var jsonString = "{'foo': 452}"; // {'foo': 452}
    var jsonStr = '{"foo": 452}'; // {"foo": 452}
    
    JSON.parse( jsonString ); // Unexpected token ' in JSON at position 1(…)
    JSON.parse( jsonStr ); // Object {foo: 452}
    
    objLiteral['key'] = 'val'; // Object {foo: 42, key: "val"}
    objLiteral.key2 = 'val';
    
    // objLiteral.key\n3 - SyntaxError: Invalid or unexpected token
    objLiteral['key\n3'] = 'val'; // Object {"foo": "42", key: "val", key2: "val", "key↵3": "val"}
    
    JSON.stringify( objLiteral ); // {"foo":"42","key":"val","key2":"val","key\n3":"val"}
    

物体 プロパティアクセサ ドット表記またはブラケット表記を使用して、オブジェクトのプロパティへのアクセスを提供します。

  1. ►より限られた範囲の値があります(たとえば、機能が許可されていません)。値は、二重引用符、数字、ブール、ヌル、オブジェクト、または配列の文字列にすることができます。これらの構造はネストできます。

    var objLiteral = {};
    objLiteral.funKey = function sayHello() {
        console.log('Object Key with function as value - Its outcome message.');
    };
    
    objLiteral['Key'] = 'Val';
    
    console.log('Object Literal Fun : ', objLiteral );
    // Object Literal Fun :  Object {Key: "Val"}Key: "Val"funKey: sayHello()__proto__: Object
    console.log( JSON.stringify( objLiteral ) ); // {"Key":"Val"}
    

enter image description here


JavaScript ECMAScript標準の最も人気のある実装です。 JavaScriptのコア機能はECMAScript標準に基づいていますが、JavaScriptにはECMA仕様/標準にない他の追加機能もあります。 すべてのブラウザにはJavaScriptインタープリターがあります。

JavaScriptは動的にタイプされた言語です。つまり、変数を宣言するときに変数のデータ型を指定する必要はなく、スクリプトの実行中に必要に応じてデータ型が自動的に変換されます。

Literals :

'37' - 7    // 30
'37' + 7    // "377"
+'37' + 7   // 44
+'37'       // 37
'37'        // "37"

parseInt('37');     // 37
parseInt('3.7');    // 3

parseFloat(3.7);    // 3.7

// An alternative method of retrieving a number from a string is with the + (unary plus) operator:
+'3.7'              // 3.7

Object literals RFC 7159

オブジェクト構造は、ゼロ以上の名前/値ペア(またはメンバー)を囲む巻き毛ブラケットのペアとして表されます。名前は文字列です。単一のコロンが各名前の後に来て、名前を値から分離します。単一のコンマは、値を次の名前から分離します。オブジェクト内の名前は一意でなければなりません。

ECMAScriptは、プロトタイプベースの継承をサポートしています。すべてのコンストラクターには関連するプロトタイプがあり、そのコンストラクターによって作成されたすべてのオブジェクトには、コンストラクターに関連付けられたプロトタイプ(オブジェクトのプロトタイプと呼ばれる)への暗黙の参照があります。さらに、プロトタイプには、そのプロトタイプなどへの非ヌルの暗黙的な参照がある場合があります。これはプロトタイプチェーンと呼ばれます。

一般に、クラスベースのオブジェクト指向言語では、状態はインスタンスによって運ばれ、メソッドはクラスによって運ばれ、継承は構造と行動のみです。 ECMAScriptでは、状態と方法はオブジェクトによって運ばれ、構造、行動、状態はすべて継承されます。

プロトタイプは、ECMAScriptの構造、状態、および行動の継承を実装するために使用されるオブジェクトです。コンストラクターがオブジェクトを作成すると、そのオブジェクトは、プロパティ参照を解決する目的で、コンストラクターの関連プロトタイプを暗黙的に参照します。コンストラクターに関連するプロトタイプは、プログラム式constructor.prototypeによって参照でき、オブジェクトのプロトタイプに追加されたプロパティは、継承を通じて、プロトタイプを共有するすべてのオブジェクトによって共有されます。

RFC はブログや意見に基づく誤解よりも重要であると依然として考えている人のために、いくつかの点を明確にして答えてみましょう。以前の回答ですでに言及されているすべての正しい違いを繰り返すつもりはありません。ここでは、いくつかの重要な部分を要約して値を追加しようとしているだけですrfc7159

からの抜粋 https://tools.ietf.org/html/rfc7159

  1. JavaScript 物体 表記法 (JSON) は、 構造化データのシリアル化。それは、 物体 ECMAScript プログラミングで定義されている JavaScript のリテラル 言語標準、第 3 版 [ECMA-262]。
  2. JSONは、4つのプリミティブタイプ(文字列、数字、ブールリアン、ヌル)と2つの構造化されたタイプを表すことができます。オブジェクト および配列)。
  3. アン 物体 は、0 個以上の名前/値の順序付けられていないコレクションです。 名前が文字列で、値が文字列、数値、 ブール値、null、 物体, 、または配列。
  4. 開始オブジェクト = ws %x7B ws ;{ 左中括弧
  5. エンドオブジェクト = ws %x7D ws ;右中括弧
  6. JSON 値は次のようにする必要があります。 物体, 、配列、番号、または文字列、または次の3つのリテラル名のいずれか:false null tr​​ue
  7. アン 物体 構造は一対の中括弧として表されます
  8. 内の名前 物体 一意である必要があります。 物体 = 開始オブジェクト [ メンバー *( 値区切りメンバー ) ] エンドオブジェクト
  9. アン 物体 その名前がすべて一意であるという意味で相互運用可能です すべてのソフトウェア実装がそれを受け取ること 物体 同意します 名前と値のマッピング。内の名前が 物体 ではない unique、そのような 物体 です 予測できない。
  10. 例(RFC 12 ページより)

    これは JSON オブジェクトです。

          {
            "Image": {
                "Width":  800,
                "Height": 600,
                "Title":  "View from 15th Floor",
                "Thumbnail": {
                    "Url":    "http://www.example.com/image/481989943",
                    "Height": 125,
                    "Width":  100
                },
                "Animated" : false,
                "IDs": [116, 943, 234, 38793]
              }
          }
    

    そのイメージ メンバーは、 物体 サムネイルのメンバーは 物体 IDSメンバーは数字の配列です。

実際には「JSON オブジェクト」などというものは存在しません。

本当に?

私が理解する限り、主な違いは 柔軟性.

JSONは、「JavaScriptオブジェクト表記」の一種のラッパーであり、ユーザーがオブジェクトを定義するためのより厳格なルールに従うことを強制します。また、JavaScriptオブジェクト表記機能によって提供される可能なオブジェクト宣言の方法を制限することにより、これを行います。

その結果、プラットフォーム間のデータ交換により適したよりシンプルで標準化されたオブジェクトがあります。

したがって、基本的に、上記の私の例の新しいオブジェクトは、JavaScript OBJEECT表記を使用して定義されるオブジェクトです。しかし、JSON標準が必要とするルールに従っていないため、「有効な」JSONオブジェクトではありません。

このリンクも非常に役立ちます:http://msdn.microsoft.com/en-us/library/bb299886.aspx

まず、JSONが何であるかを知っておく必要があります。

言語不可知論のデータインターチェンジ形式です。 JSONの構文は、JavaScriptオブジェクトのリテラル表記に触発されましたが、それらの間には違いがあります。

たとえば、JSONではすべてのキーを引用する必要がありますが、オブジェクトリテラルではこれは必要ありません。

// json:{"foo": "bar"}

//オブジェクトリテラル:var o = {foo: "bar"}; JavaScript(ECMAScript3rd。Editionで正確に)では、プロパティ名として予約された単語の使用法が許可されているため、JavaScript(より正確に正確にはECMAScript3rd。Edition)で引用が必須です。

var o = {if: "foo"}; // ES3のSyntaxerrorは、プロパティ名として文字列の文字列を使用する(プロパティ名を引用)には問題ありません。

var o = {"if": "foo"};したがって、「互換性」(そして簡単に評価するのでしょうか?)の場合、引用は必須です。

JSONのデータ型も次の値に制限されています。

文字列番号オブジェクトアレイはリテラルとして:true false null文字列の文法が変わります。それらは二重引用符で区切る必要がありますが、JavaScriptでは、単一または二重引用符を同じ意味で使用できます。

//無効なjson:{"foo": 'bar'}承認された数字のjson文法も変更されます。JavaScriptでは、16進数リテラルを使用できます。小数リテラルのみ。

//無効なjson:{"foo":0xff}

JavaScriptオブジェクトリテラル対JSON:

  • オブジェクトリテラル構文は、JavaScriptオブジェクトを作成するための非常に便利な方法です
  • JSON 「JavaScriptオブジェクト表記」を表す言語には、JavaScriptオブジェクトリテラル構文から派生した構文があります。これは、プログラミング言語に依存しないテキストデータ転送形式として使用されます。

例:

JSオブジェクト表記は、JSで使用されてコード内のオブジェクトを便利に作成するために使用されます。

const JS_Object = {
  1: 2,  // the key here is the number 1, the value is the number 2
  a: 'b', // the key is the string a, the value is the string b
  func: function () { console.log('hi') }
  // the key is func, the value is the function
}

JSONの例:

{"widget": {
    "debug": "on",
    "window": {
        "title": "Sample Konfabulator Widget",
        "name": "main_window",
        "width": 500,
        "height": 500
    },
    "image": { 
        "src": "Images/Sun.png",
        "name": "sun1",
        "hOffset": 250,
        "vOffset": 250,
        "alignment": "center"
    },
    "text": {
        "data": "Click Here",
        "size": 36,
        "style": "bold",
        "name": "text1",
        "hOffset": 250,
        "vOffset": 100,
        "alignment": "center",
        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
    }
}}

主な違い:

  • JSONのすべてのオブジェクトキーは文字列でなければなりません。 JavaScriptオブジェクトでは、キーは文字列または数字です

  • JSONのすべての文字列は、「二重引用符」で引用する必要があります。一方、JavaScriptでは、単一の引用と二重引用符の両方が許可されています。 JavaScriptオブジェクト表記に引用符がない場合でも、オブジェクトキーは文字列に暗黙的にキャストされます。

  • JSONでは、関数をオブジェクトの値として定義することはできません(これはJavaScript固有であるため)。 JavaScriptでは、これは完全に合法です。

JavaScriptビルドイン JSON 物体:

JSON オブジェクトはJavaScriptに簡単に変換でき、その逆を使用して逆 JSON JavaScriptがランタイムで提供するオブジェクト。例えば:

const Object = {
  property1: true,
  property2: false,
}; // creating object with JS object literal syntax

const JSON_object = JSON.stringify(Object);  // stringify JS object to a JSON string

console.log(JSON_object); // note that the (string) keys are in double quotes

const JS_object = JSON.parse(JSON_object);  // parse JSON string to JS object

console.log(JS_object.property1, JS_object.property2); 
// accessing keys of the newly created object

驚くべき違いが1つあります:使用できません undefined JSONでは、未定義の値を持つすべてのオブジェクトフィールドがその後消えます JSON.stringify

let object =  { "a": undefined } ;

let badJSON= '{ "a": undefined }';


console.log('valid JS object :', object );
console.log('JSON from object:', JSON.stringify(object) );
console.log('invalid json    :', JSON.parse(badJSON) );

🙈🙉🙊

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top