web-dev-qa-db-ja.com

JSONとObject Literal Notationの違いは何ですか?

Object Literal NotationJSON objectを使用して定義されたJavaScriptオブジェクトの主な違いは誰か教えてもらえますか?

JavaScriptの本によると、これはObject Notationを使用して定義されたオブジェクトであると書かれています。

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

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

206
pencilCake

最初に JSON が実際に何であるかを明確にしましょう。 JSONはtextual、言語に依存しないデータ交換形式で、XML、CSV、YAMLによく似ています。

データはさまざまな方法で保存できますが、テキストファイルに保存し、コンピューターで読み取り可能にする必要がある場合は、何らかの構造に従う必要があります。 JSONは、このような構造を定義する多くの形式の1つです。

このような形式は通常、言語に依存しません。つまり、Java、Python、JavaScript、PHPで処理できることを意味します。

対照的に、JavaScriptはプログラミング言語です。もちろん、JavaScriptはデータを定義/記述する方法も提供しますが、構文はJavaScriptに非常に固有のものです。

反例として、Pythonにはtuplesの概念があり、その構文は(x, y)です。 JavaScriptにはこのようなものはありません。


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

JSONには次の構文上の制約があります。

  • オブジェクトkeysstringsでなければなりません(つまり、二重引用符で囲まれた文字シーケンス") 。
  • 値は次のいずれかです。
    • 文字列
    • (JSON)オブジェクト
    • 配列
    • true
    • false
    • null
  • 重複キー({"foo":"bar","foo":"baz"})は、未定義の実装固有の結果を生成します。 JSON仕様では特にセマンティクスが定義されていません

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

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

それを知って、構文を見ているだけで、あなたの例は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ソースコードを記述していて、stringを処理していない場合、JSONを処理していません。データをJSONとして(たとえば、ajax経由で、またはファイルから読み込んで)受け取ったかもしれませんが、あなたまたは使用しているライブラリがそれを解析すると、JSONではなくなります。


オブジェクトリテラルとJSONがsimilarに見えるため、それらに同じ名前を付けることができるという意味ではありません。「JSONオブジェクト」などはありません も参照してください。

237
Felix Kling

JSON には、次のようなはるかに制限された構文があります。

  • キー値は引用符で囲む必要があります
  • 文字列は、"ではなく、'で引用する必要があります
  • 値の範囲がより制限されている(たとえば、機能が許可されていない)
40
Quentin

「JSON Object」のようなものは本当にありません。

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

さらに、(サイドラント...)人々が「JSONオブジェクト」について話すとき、それらはほとんど常にトップレベルに「中括弧」を持つデータを意味します。これは、javascriptオブジェクトにうまく対応しています。ただし、JSON仕様では、JSON文字列の最上位に単一の「中括弧」オブジェクトが存在する必要はありません。最上位にリストを持つこと、または単一の値を持つことさえ完全に有効なJSONです。したがって、すべての「JSONオブジェクト」は有効なJSONに対応していますが、すべての有効なJSON文字列が「JSONオブジェクト」と呼ばれるものに対応しているわけではありません。 (文字列はリストまたはアトミック値を表すことができるため)

14
Nick Perkins

JavaScriptのJSON によると、

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

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

@ -Filix Kingが示唆したように、 ドキュメント を読むことに加えて、 JSONLintオンラインJSONバリデーター をいじることもお勧めします。これが、JSONオブジェクトのキーが文字列でなければならないことを学んだ方法です。

9
ma11hew28

???? JSON :XMLの無脂肪代替品

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


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

JSONオブジェクトは、JSONテキストの解析と構築に使用される解析と文字列化の2つの関数を含む単一のオブジェクトです。

  • 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(Microsoft Corporation)です。)1994年以前はECMAは「ヨーロッパコンピュータ製造業者協会」として知られていましたが、1994年に組織がグローバルになった後、「商標」「Ecma」は歴史的な理由で保持されました。

ECMAScriptは言語ですが、JavaScript、JScript、およびActionScriptでさえ"Dialects"と呼ばれます。

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

  • SQL言語-Hibernate MySQL Dialect、Oracle Dialect、..いくつかの変更または機能の追加があります。

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

navigator.appName // "Netscape"

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

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

NOTE"第4版 ECMAScriptの 作業が不完全なため公開


JSONは、構造化されたデータの移植可能な表現のためのフォーマット規則の小さなセットを定義します。

  1. ►キー値は引用符で囲む必要があります。キーには文字列のみが許可されます。文字列以外を使用すると、文字列に変換されます。ただし、文字列以外のキーを使用することはお勧めしません。このような例を確認してください-{ 'key':'val' } over 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

    オンラインJSON Edtionsでこのコード{ "Hai\" \n Team ????":5, "Bye \'": 7 }を確認してください。 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. ►値の範囲が制限されている(たとえば、機能が許可されていない)。値は、二重引用符で囲まれた文字列、数値、ブール値、null、オブジェクト、または配列です。これらの構造はネストできます。

    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 literalsRFC 7159

オブジェクト構造は、0個以上の名前/値のペア(またはメンバー)を囲む中括弧のペアとして表されます。名前は文字列です。各名前の後に単一のコロンが続き、名前と値を区切ります。単一のコンマは、値を次の名前から分離します。オブジェクト内の名前は一意である必要があります。

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

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

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

3
Yash

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

https://tools.ietf.org/html/rfc7159 からの抽出

  1. JavaScriptObjectNotation(JSON)は、構造化データをシリアル化するためのテキスト形式です。 ECMAScriptプログラミング言語標準、第3版[ECMA-262]で定義されているように、JavaScriptのobjectリテラルから派生しています。
  2. JSONは4つのプリミティブ型(文字列、数値、ブール値、null)と2つの構造化型(objects)および配列を表すことができます。
  3. オブジェクトは、0個以上の名前/値ペアの順序付けられていないコレクションです。名前は文字列で、値は文字列、数値、ブール値、null、object、または配列。
  4. begin-object= ws%x7B ws; {左中括弧
  5. end-object= ws%x7D ws; }右中括弧
  6. JSON値は、object、配列、数値、文字列、または次の3つのリテラル名のいずれかでなければなりません:false null tr​​ue
  7. object構造は、中括弧のペアとして表されます
  8. object内の名前は一意である必要があります。 object=begin-object[member *(value-separator member)]end-object
  9. 名前がすべて一意であるobjectは、そのobjectを受け取るすべてのソフトウェア実装がname-valueに同意するという意味で相互運用可能です。マッピング。 object内の名前が一意でない場合、そのようなobjectを受け取るソフトウェアの動作は予測できません。
  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]
              }
          }
    

    Imageメンバーはobjectであり、Thumbnailメンバーはobjectであり、IDsメンバーは数字の配列です。

「JSON Object」のようなものは本当にありません。

本当に?

2
Daniele D.

私が理解する限り、主な違いはflexibilityです。

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

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

基本的に、上記の私の例のnewObjectはJavaScript Objeect Notationを使用して定義されたオブジェクトです。ただし、JSON標準が要求する規則に従っていないため、「有効な」JSONオブジェクトではありません。

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

1
pencilCake

JavascriptオブジェクトリテラルとJSON:

  • オブジェクトリテラル構文は、javascriptオブジェクトを作成する非常に便利な方法です
  • 「Javascriptオブジェクト表記」を表すJSON言語には、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では、これは完全に合法です。

JSONオブジェクトのJavascriptビルド:

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
0

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

これは、言語に依存しないデータ交換形式です。 JSONの構文はJavaScript Object Literal表記法に触発されましたが、両者には違いがあります。

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

// JSON:{"foo": "bar"}

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

var o = {if: "foo"}; // ES3のSyntaxError一方、プロパティ名として文字列リテラルを使用しても(プロパティ名を引用して)問題はありません。

var o = {"if": "foo"};そのため、「互換性」(およびおそらく簡単に評価できますか?)のために、引用符は必須です。

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

文字列番号オブジェクト配列リテラル:true false null文字列の文法が変更されます。 JavaScriptでは二重引用符で区切る必要がありますが、JavaScriptでは、単一引用符または二重引用符を同じように使用できます。

//無効なJSON:{"foo": 'bar'} Numbersの受け入れられたJSON文法も変更されます。JavaScriptでは、16進数リテラル、たとえば0xFF、または(悪名高い)Octalリテラルを使用できます。 010. JSONでは、10進数リテラルのみを使用できます。

//無効なJSON:{"foo":0xFF}

0