JSON और वस्तु शाब्दिक संकेतन के बीच अंतर क्या है?


220

क्या कोई मुझे बता सकता है कि ऑब्जेक्ट लिटरेचर नोटेशन और JSON ऑब्जेक्ट का उपयोग करके परिभाषित जावास्क्रिप्ट ऑब्जेक्ट के बीच मुख्य अंतर क्या है ?

जावास्क्रिप्ट पुस्तक के अनुसार यह कहता है कि यह ऑब्जेक्ट नोटेशन का उपयोग करके परिभाषित की गई वस्तु है :

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

इस मामले में यह JSON ऑब्जेक्ट क्यों नहीं है? सिर्फ इसलिए कि इसे उद्धरण चिह्नों का उपयोग करके परिभाषित नहीं किया गया है?


20
"इस मामले में यह JSON ऑब्जेक्ट क्यों नहीं है?": क्योंकि आपकी कुंजियाँ स्ट्रिंग्स होनी चाहिए, और फ़ंक्शन एक मान्य JSON मान नहीं है।
मैट

जवाबों:


248

आइए पहले स्पष्ट करें कि JSON वास्तव में क्या है। JSON XML, CSV या YAML की तरह एक टेक्स्टुअल , भाषा-स्वतंत्र डेटा-एक्सचेंज प्रारूप है।

डेटा को कई तरीकों से संग्रहीत किया जा सकता है, लेकिन अगर इसे एक टेक्स्ट फ़ाइल में संग्रहीत किया जाना चाहिए और कंप्यूटर द्वारा पठनीय होना चाहिए, तो इसे कुछ संरचना का पालन करना होगा। JSON ऐसे कई स्वरूपों में से एक है जो इस तरह की संरचना को परिभाषित करते हैं।

ऐसे प्रारूप आम तौर पर भाषा-स्वतंत्र होते हैं, जिसका अर्थ है कि उन्हें जावा, पायथन, जावास्क्रिप्ट, पीएचपी द्वारा संसाधित किया जा सकता है, आप इसे नाम देते हैं।

इसके विपरीत, जावास्क्रिप्ट एक प्रोग्रामिंग भाषा है। बेशक जावास्क्रिप्ट भी डेटा को परिभाषित / वर्णन करने का एक तरीका प्रदान करता है, लेकिन सिंटैक्स जावास्क्रिप्ट के लिए बहुत विशिष्ट है।

एक काउंटर उदाहरण के रूप में, पायथन में टुपल्स की अवधारणा है , उनका सिंटैक्स है (x, y)। जावास्क्रिप्ट में ऐसा कुछ नहीं है।


JSON और जावास्क्रिप्ट ऑब्जेक्ट शाब्दिक के बीच वाक्यविन्यास अंतर को देखते हैं।

JSON में निम्नलिखित वाक्यात्मक अवरोध हैं:

  • ऑब्जेक्ट कुंजियाँ स्ट्रिंग्स (यानी दोहरे कोट्स में संलग्न एक वर्ण क्रम ") होनी चाहिए ।
  • मान या तो हो सकते हैं:
    • एक स्ट्रिंग
    • एक संख्या
    • a (JSON) ऑब्जेक्ट
    • एक सरणी
    • true
    • false
    • null
  • डुप्लिकेट कुंजियाँ ( {"foo":"bar","foo":"baz"}) अपरिभाषित, कार्यान्वयन-विशिष्ट परिणाम उत्पन्न करती हैं; JSON विनिर्देश विशेष रूप से उनके शब्दार्थ को परिभाषित नहीं करता है

जावास्क्रिप्ट में, वस्तु शाब्दिक हो सकते हैं

  • स्ट्रिंग शाब्दिक, संख्या शाब्दिक या पहचानकर्ता नाम कुंजी के रूप में (ईएस 6 के बाद से, अब चाबियाँ भी गणना की जा सकती हैं, जो अभी तक एक और वाक्यविन्यास का परिचय देती हैं)।
  • फ़ंक्शन फ़ंक्शन परिभाषाओं सहित मान किसी भी मान्य जावास्क्रिप्ट अभिव्यक्ति हो सकते हैं और undefined
  • डुप्लिकेट कुंजियाँ निर्धारित, निर्दिष्ट परिणाम (ढीली मोड में, बाद की परिभाषा पूर्व की जगह लेती हैं; सख्त मोड में, यह एक त्रुटि है)।

यह जानकर कि, सिंटैक्स को देखकर , आपका उदाहरण दो कारणों से JSON नहीं है:

  1. आपकी चाबियाँ तार (शाब्दिक) नहीं हैं। वे पहचानकर्ता नाम हैं
  2. आप फ़ंक्शन को "JSON ऑब्जेक्ट" के मान के रूप में असाइन नहीं कर सकते (क्योंकि JSON फ़ंक्शन के लिए कोई सिंटैक्स परिभाषित नहीं करता है)।

लेकिन सबसे महत्वपूर्ण बात, शुरुआत से ही मेरा स्पष्टीकरण दोहराना: आप एक जावास्क्रिप्ट संदर्भ में हैं। आप एक जावास्क्रिप्ट ऑब्जेक्ट परिभाषित करते हैं। यदि कोई हो, "JSON ऑब्जेक्ट" केवल एक स्ट्रिंग में समाहित किया जा सकता है:

 var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
 var json = '{"foo": 452}'; // creates a string containing JSON

यदि आप जावास्क्रिप्ट स्रोत कोड लिख रहे हैं, और एक स्ट्रिंग के साथ काम नहीं कर रहे हैं, तो आप JSON के साथ काम नहीं कर रहे हैं। हो सकता है कि आपको JSON के रूप में डेटा प्राप्त हुआ हो (उदाहरण, ajax या किसी फ़ाइल से पढ़ने के माध्यम से), लेकिन एक बार जब आप या आपके द्वारा उपयोग की जा रही लाइब्रेरी ने इसे पार्स कर दिया, तो यह JSON नहीं है।


केवल इसलिए कि वस्तु शाब्दिक और JSON एक जैसे दिखते हैं , इसका मतलब यह नहीं है कि आप उन्हें परस्पर विनिमय नाम दे सकते हैं। यह भी देखें कि "JSON ऑब्जेक्ट" जैसी कोई चीज नहीं है


8
यह भी ध्यान दें कि JSON वस्तु शाब्दिक संकेतन का एक उपसमुच्चय है
शॉन किन्से

14
@SeanKinsey: सिवाय यह नहीं है कि: timelessrepo.com/json-isnt-a-javascript-subset
mpen

1
ध्यान देने योग्य बात यह हो सकती है कि आम तौर पर आप एक संदर्भ में जावास्क्रिप्ट ऑब्जेक्ट शाब्दिक की अपेक्षा करेंगे जहां टिप्पणियाँ कानूनी हों, और JSON कल्पना टिप्पणियों के लिए अनुमति नहीं देती है ( इस पोस्ट को देखें ।
ब्रायन हेनरी

ऑब्जेक्ट शाब्दिक रूप से कुंजी हमेशा तार होती है, इसके बावजूद कि आप "" का उपयोग करते हैं या नहीं।
ओवरएक्सचेंज

2
@overexchange: "ऑब्जेक्ट शाब्दिक में कुंजियाँ हमेशा तार होती हैं" आप यहाँ दो चीजें मिला रहे हैं, लेकिन मैं आपको दोष नहीं दे सकता क्योंकि मैंने भी यहाँ एक स्पष्ट रेखा नहीं खींची थी। आपको एक वस्तु शाब्दिक और एक वस्तु मूल्य के बीच अंतर करना होगा । एक शाब्दिक वर्ण अनुक्रम है जिसे आप स्रोत कोड में लिखते हैं। मूल्य क्या स्रोत कोड की व्याख्या के द्वारा बनाई गई है। ऑब्जेक्ट शाब्दिक (सिंटैक्स) आपको पहचानकर्ता नाम , स्ट्रिंग शाब्दिक या संख्या शाब्दिक का उपयोग करने की अनुमति देता है । आप सही हैं कि रनटाइम के दौरान, वे सभी स्ट्रिंग्स में बदल जाते हैं (लेकिन हमारे पास अब भी प्रतीक हैं)।
फेलिक्स क्लिंग

41

JSON में बहुत अधिक सीमित सिंटैक्स शामिल हैं:

  • मुख्य मूल्यों को उद्धृत किया जाना चाहिए
  • स्ट्रिंग्स के साथ उद्धृत किया जाना चाहिए "और नहीं'
  • आपके पास मूल्यों की एक अधिक सीमित श्रेणी है (जैसे कोई कार्य अनुमत नहीं है)

1
इसे "कोई फ़ंक्शन अनुमति नहीं है" पसंद आया।
करण काव

टिप्पणियों की भी अनुमति नहीं है। संदिग्ध कारणों के लिए। (उन्हें कुछ बार सवाल सुना।) यह मुख्य अंतर है "मैं कहता हूं।
user7610

15

वास्तव में "JSON ऑब्जेक्ट" जैसी कोई चीज नहीं है।

JSON युक्ति एक स्ट्रिंग के रूप में डेटा को एन्कोडिंग करने के लिए एक सिंटैक्स है। जिसे लोग "JSON ऑब्जेक्ट" (जावास्क्रिप्ट में) कहते हैं, वह वास्तव में केवल एक सामान्य जावास्क्रिप्ट ऑब्जेक्ट है, जिसमें (संभवतः) एक वैध JSON स्ट्रिंग से डी-सीरियलाइज़ किया गया है, और आसानी से एक वैध JSON स्ट्रिंग के रूप में पुन: क्रमबद्ध किया जा सकता है। इसका आम तौर पर मतलब है कि इसमें केवल डेटा होता है (और फ़ंक्शंस नहीं)। इसका यह भी अर्थ है कि कोई दिनांक नहीं हैं, क्योंकि JSON में दिनांक प्रकार नहीं है (शायद JSON के बारे में सबसे दर्दनाक बात);

इसके अलावा, (साइड-रेंट ...) जब लोग "JSON ऑब्जेक्ट" के बारे में बात करते हैं, तो उनका मतलब लगभग हमेशा डेटा होता है जिसमें शीर्ष स्तर पर "घुंघराले-ब्रेसिज़" होते हैं। यह अच्छी तरह से एक जावास्क्रिप्ट वस्तु से मेल खाता है। हालाँकि, JSON युक्ति की आवश्यकता नहीं है कि JSON स्ट्रिंग के शीर्ष-स्तर पर एक "कर्ली-ब्रेसेस" ऑब्जेक्ट हो। शीर्ष स्तर पर सूची होना या यहां तक ​​कि सिर्फ एक मूल्य होना भी पूरी तरह से वैध JSON है। तो, जबकि हर "JSON ऑब्जेक्ट" वैध JSON से मेल खाता है, सभी JSON स्ट्रिंग्स के अनुरूप नहीं है, जिसे हम "JSON ऑब्जेक्ट" कहेंगे! (क्योंकि स्ट्रिंग सूची या परमाणु मूल्य का प्रतिनिधित्व कर सकती है)


5
आपके उत्तर में एक त्रुटि है: शीर्ष स्तर पर परमाणु मान होना अमान्य JSON है। JSON शीर्ष को एक ऑब्जेक्ट या एक सरणी होने की अनुमति देता है, लेकिन कुछ और नहीं। RFC4627 , मानक, JSON के व्याकरण का वर्णन करता है JSON-text = object / array
रोरी ओ'केन

9

जावास्क्रिप्ट में JSON के अनुसार ,

JSON जावास्क्रिप्ट के ऑब्जेक्ट शाब्दिक अंकन का एक सबसेट है।

दूसरे शब्दों में, वैध JSON भी मान्य जावास्क्रिप्ट ऑब्जेक्ट शाब्दिक संकेतन है, लेकिन जरूरी नहीं कि अन्य तरीके से भी।

प्रलेखन को पढ़ने के अलावा , @Filix King ने सुझाव दिया, मैं JSONLint ऑनलाइन JSON सत्यापनकर्ता के साथ खेलने का भी सुझाव देता हूं । इस तरह से मुझे पता चला कि JSON ऑब्जेक्ट्स की कुंजी स्ट्रिंग्स होनी चाहिए।


2
बस ध्यान दें: यह एक सटीक उपसमुच्चय नहीं है , कुछ JSON स्ट्रिंग्स हैं जो जेएस ऑब्जेक्ट शाब्दिक के रूप में अमान्य थे
बरगी

5

JSON : XML के लिए फैट-फ्री विकल्प

JSON को व्यापक रूप से उन लोगों द्वारा अपनाया गया है जिन्होंने पाया कि वितरित अनुप्रयोगों और सेवाओं का उत्पादन करना बहुत आसान है। JSON के लिए आधिकारिक इंटरनेट मीडिया प्रकार है application/json RFC 4627। JSON फ़ाइल नाम एक्सटेंशन का उपयोग करता है .json


Text जावास्क्रिप्ट ऑब्जेक्ट नोटेशन ( JSON) एक हल्का, पाठ-आधारित, भाषा-स्वतंत्र डेटा इंटरचेंज प्रारूप है। JSON का उपयोग किसी भी प्रोग्रामिंग भाषा में लिखे गए अनुप्रयोगों के बीच डेटा का आदान-प्रदान करने के लिए किया गया है।

JSON ऑब्जेक्ट एक एकल ऑब्जेक्ट है जिसमें दो फ़ंक्शन, पार्स और स्ट्रिंग होते हैं, जो JSON टेक्स्ट को पार्स और बनाने के लिए उपयोग किए जाते हैं।

  • JSON.stringify एक स्ट्रिंग का उत्पादन करता है जो निम्न JSON व्याकरण के अनुरूप होता है।
  • JSON.parse एक स्ट्रिंग को स्वीकार करता है जो JSON व्याकरण के अनुरूप है।

ParseJSON विधि में शामिल किया जाएगा Fourth Edition of ECMAScript। इस बीच, 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 जावास्क्रिप्ट का सबसेट है। जावास्क्रिप्ट ECMAScript प्रोग्रामिंग लैंग्वेज स्टैंडर्ड से लिया गया था।


► ईसीएमएस्क्रिप्ट

ECMAScript दुनिया की सबसे अधिक इस्तेमाल की जाने वाली सामान्य प्रयोजन प्रोग्रामिंग भाषाओं में से एक बन गई है। यह वेब ब्राउज़र में एम्बेडेड भाषा के रूप में जाना जाता है, लेकिन सर्वर और एम्बेडेड अनुप्रयोगों के लिए भी व्यापक रूप से अपनाया गया है। ECMAScript कई उद्भव प्रौद्योगिकियों पर आधारित है, सबसे प्रसिद्ध जा रहा है JavaScript(नेटस्केप कम्युनिकेशंस)) और JScript(Microsoft Corporation)।)हालांकि 1994 से पहले, ECMA को "यूरोपीय कंप्यूटर निर्माता संघ" के रूप में जाना जाता था, 1994 के बाद, जब संगठन वैश्विक हो गया, तो ऐतिहासिक कारणों से "ट्रेडमार्क" "एक्मा" रखा गया।

ECMAScript भाषा है, जबकि जावास्क्रिप्ट, JScript और यहां तक ​​कि ActionScript को भी कहा जाता है "Dialects"

बोलियाँ एक ही भाषा से ली गई हैं। वे एक-दूसरे से काफी मिलते-जुलते हैं क्योंकि वे एक ही भाषा से निकले हैं लेकिन उनमें कुछ बदलाव आए हैं। भाषा में ही एक बोली भिन्नता है। यह एक ही भाषा से लिया गया है।

  • एसक्यूएल भाषा - हाइबरनेट माय SQL बोली, ओरेकल बोली, .. जिसमें कुछ परिवर्तन या अतिरिक्त कार्यक्षमता है।

अपने उपयोगकर्ताओं के ब्राउज़र और कंप्यूटर के बारे में जानकारी।

navigator.appName // "Netscape"

ECMAScript स्क्रिप्टिंग भाषा है जो जावास्क्रिप्ट का आधार बनाती है। 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.

नोट « ECMAScript का 4 वाँ संस्करण प्रकाशित नहीं हुआ क्योंकि कार्य अपूर्ण था


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. And JSON स्ट्रिंग्स को "और नहीं 'के साथ उद्धृत किया जाना चाहिए। एक स्ट्रिंग बहुत सी या जावा स्ट्रिंग की तरह है। स्ट्रिंग्स को दोहरे उद्धरण चिह्नों में लपेटा जाना चाहिए।

    • साहित्य निश्चित मूल्य हैं, चर नहीं, जो आप अपनी लिपि में सचमुच प्रदान करते हैं।
    • एक स्ट्रिंग शून्य या अधिक वर्णों का एक क्रम है, जो बैकस्लैश एस्केप के साथ उद्धरण में लिपटे हुए हैं, वही प्रोग्रामिंग भाषाओं में उपयोग किया जाता है।
      • Bol - विशेष प्रतीकों को स्ट्रिंग में अनुमति दी जाती है लेकिन उपयोग करने के लिए दोबारा नहीं।
      • \ "- विशेष वर्ण बच सकते हैं। लेकिन बचने के लिए नहीं (') एकल उद्धरण। सख्त मोड में यह फेंक देगा और त्रुटि - 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"}

यहां छवि विवरण दर्ज करें


JavaScriptECMAScript मानक के सबसे लोकप्रिय कार्यान्वयन है। जावास्क्रिप्ट की मुख्य विशेषताएं ECMAScript मानक पर आधारित हैं, लेकिन जावास्क्रिप्ट में अन्य अतिरिक्त विशेषताएं भी हैं जो ECMA विनिर्देशों / मानक में नहीं हैं। हर ब्राउज़र में एक जावास्क्रिप्ट दुभाषिया होता है।

जावास्क्रिप्ट एक गतिशील रूप से टाइप की गई भाषा है। इसका मतलब है कि जब आप इसे घोषित करते हैं तो आपको डेटा प्रकार के चर को निर्दिष्ट करने की आवश्यकता नहीं होती है, और स्क्रिप्ट निष्पादन के दौरान डेटा प्रकार स्वचालित रूप से आवश्यकतानुसार परिवर्तित हो जाते हैं।

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 में, राज्य और तरीके वस्तुओं द्वारा किए जाते हैं, और संरचना, व्यवहार और राज्य सभी विरासत में मिलते हैं।

एक प्रोटोटाइप ईसीएमएस्क्रिप्ट में संरचना, स्थिति और व्यवहार विरासत को लागू करने के लिए उपयोग की जाने वाली वस्तु है। जब कोई कंस्ट्रक्टर एक ऑब्जेक्ट बनाता है, तो वह ऑब्जेक्ट स्पष्ट रूप से संपत्ति के संदर्भों को हल करने के उद्देश्य से कंस्ट्रक्टर के संबंधित प्रोटोटाइप का संदर्भ देता है। कंस्ट्रक्टर के जुड़े प्रोटोटाइप को प्रोग्राम एक्सप्रेशन constructor.prototype द्वारा संदर्भित किया जा सकता है, और किसी ऑब्जेक्ट के प्रोटोटाइप में जोड़े गए गुण, इनहेरिटेंस के माध्यम से, सभी ऑब्जेक्ट्स द्वारा प्रोटोटाइप को साझा करते हुए साझा किए जाते हैं।


2

उन लोगों के लिए जो अभी भी सोचते हैं कि RFC ब्लॉग और राय आधारित गलत धारणाओं से अधिक महत्वपूर्ण हैं, आइए कुछ बिंदुओं को स्पष्ट करने का उत्तर देने का प्रयास करें। मैं पहले से ही पिछले उत्तर में वर्णित सभी सही मतभेदों को दोहराने नहीं जा रहा हूं, यहां मैं कुछ महत्वपूर्ण भाग rf7459 को संक्षेप में जोड़कर मान की कोशिश कर रहा हूं

Https://tools.ietf.org/html/rfc7159 से अर्क

  1. जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON) संरचित डेटा के क्रमांकन के लिए एक पाठ प्रारूप है। यह जावास्क्रिप्ट के ऑब्जेक्ट लिटरल्स से लिया गया है , जैसा कि ECMAScript प्रोग्रामिंग लैंग्वेज स्टैंडर्ड, थर्ड एडिशन [ECMA-262] में परिभाषित किया गया है।
  2. JSON चार आदिम प्रकारों (तारों, संख्याओं, बूलियनों और नल) और दो संरचित प्रकारों ( वस्तुओं और सरणियों) का प्रतिनिधित्व कर सकता है ।
  3. एक वस्तु शून्य या अधिक नाम / मूल्य जोड़े का एक अनियोजित संग्रह है, जहां एक नाम एक स्ट्रिंग है और एक मूल्य एक स्ट्रिंग, संख्या, बूलियन, अशक्त, वस्तु या सरणी है।
  4. start -object = ws% x7B ws; {बायां कर्ली ब्रैकेट
  5. end-object = ws% x7D ws; } राइट कर्ली ब्रैकेट
  6. एक JSON मान एक वस्तु , सरणी, संख्या, या स्ट्रिंग होना चाहिए , या निम्नलिखित तीन शाब्दिक नामों में से एक होना चाहिए : गलत शून्य सच
  7. एक वस्तु संरचना को घुंघराले कोष्ठक की एक जोड़ी के रूप में दर्शाया गया है
  8. किसी ऑब्जेक्ट के नाम अद्वितीय होने चाहिए। वस्तु = आरंभ-वस्तु [सदस्य * (मूल्य-विभाजक सदस्य)] अंत-वस्तु
  9. एक ऑब्जेक्ट जिसका नाम सभी अद्वितीय हैं, इस अर्थ में अंतर है कि उस ऑब्जेक्ट को प्राप्त करने वाले सभी सॉफ़्टवेयर कार्यान्वयन नाम-मूल्य मैपिंग पर सहमत होंगे। जब किसी वस्तु के भीतर नाम अद्वितीय नहीं होते हैं, तो सॉफ्टवेयर का व्यवहार जो इस तरह की वस्तु प्राप्त करता है अप्रत्याशित होता है।
  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]
              }
          }

    इसकी छवि सदस्य एक ऐसी वस्तु है जिसका थंबनेल सदस्य एक वस्तु है और जिसकी आईडी सदस्य संख्या की एक सरणी है।

वास्तव में "JSON ऑब्जेक्ट" जैसी कोई चीज नहीं है।

वास्तव में?


1
डेवी, यह नहीं है Object, यह एक है String। धन्यवाद
अबु अबू

1

जहां तक ​​मैं समझता हूं कि मुख्य अंतर लचीलापन है

JSON "जावास्क्रिप्ट ऑब्जेक्ट नोटेशन" पर एक प्रकार का आवरण है, जो उपयोगकर्ताओं को वस्तुओं को परिभाषित करने के लिए अधिक सख्त नियमों का पालन करने के लिए मजबूर करता है। और यह जावास्क्रिप्ट ऑब्जेक्ट नोटेशन सुविधा द्वारा प्रदान किए गए संभावित ऑब्जेक्ट घोषणा तरीकों को सीमित करके करता है।

परिणामस्वरूप हमारे पास एक सरल और अधिक मानकीकृत ऑब्जेक्ट हैं जो प्लेटफार्मों के बीच डेटा-एक्सचेंज पर बेहतर सूट करते हैं।

तो मूल रूप से, ऊपर मेरे उदाहरण में newObject जावास्क्रिप्ट ऑब्जेक्ट नोटेशन का उपयोग करके परिभाषित एक वस्तु है; लेकिन यह एक 'वैध' JSON ऑब्जेक्ट नहीं है क्योंकि यह JSON मानकों की आवश्यकता वाले नियमों का पालन नहीं करता है।

यह लिंक भी काफी मददगार है: http://msdn.microsoft.com/en-us/library/bb299886.aspx


2
JSON और ऑब्जेक्ट नोटेशन का उद्देश्य पूरी तरह से अलग है: पहला केवल डेटा इंटरचेंजिंग के लिए उपयोग किया जाता है और दूसरा केवल आंतरिक उपयोग के लिए JS ऑब्जेक्ट बनाने के लिए है। वे एक ही चीज़ के अधिक और कम सख्त संस्करण नहीं हैं।
इलियो

0

पहले आपको पता होना चाहिए कि JSON क्या है:

यह भाषा अज्ञेय डेटा-इंटरचेंज प्रारूप है। JSON का सिंटैक्स जावास्क्रिप्ट ऑब्जेक्ट लिटरेचर नोटेशन से प्रेरित था, लेकिन उनके बीच मतभेद हैं।

उदाहरण के लिए, JSON में सभी कुंजियों को उद्धृत किया जाना चाहिए, जबकि वस्तु शाब्दिक रूप से यह आवश्यक नहीं है:

// JSON: {"foo": "बार"}

// ऑब्जेक्ट शाब्दिक: var o = {foo: "bar"}; JSON पर उद्धरण अनिवार्य हैं क्योंकि जावास्क्रिप्ट (वास्तव में ECMAScript 3। संस्करण में अधिक), उदाहरण के लिए, संपत्ति के नाम के रूप में आरक्षित शब्दों का उपयोग अस्वीकृत है:

var o = {अगर: "फू"}; / / ES3 में SyntaxError जबकि, संपत्ति के नाम के रूप में एक स्ट्रिंग शाब्दिक का उपयोग करते हुए (संपत्ति के नाम को उद्धृत करते हुए) कोई समस्या नहीं देता है:

var o = {"अगर": "फू"}; तो "अनुकूलता" (और शायद आसान हो सकता है?) के लिए उद्धरण अनिवार्य हैं।

JSON में डेटा प्रकार भी निम्न मानों तक सीमित हैं:

स्ट्रिंग संख्या ऑब्जेक्ट सरणी एक शाब्दिक के रूप में: सच्चा झूठा अशक्त स्ट्रिंग्स का व्याकरण बदलता है। उन्हें दोहरे उद्धरणों द्वारा सीमांकित किया जाना है, जबकि जावास्क्रिप्ट में, आप एकल या दोहरे उद्धरणों का परस्पर उपयोग कर सकते हैं।

// अमान्य JSON: {"foo": 'bar'} स्वीकृत संख्याओं का JSON व्याकरण भी बदलता है, जावास्क्रिप्ट में आप हेक्साडेसिमल लिटरल का उपयोग कर सकते हैं, उदाहरण के लिए 0xFF, या (कुख्यात) ऑक्टेल लिटरल जैसे 010. JSON में आप उपयोग कर सकते हैं केवल दशमलव साहित्य।

// अमान्य JSON: {"foo": 0xFF}


0

जावास्क्रिप्ट वस्तु शाब्दिक बनाम JSON:

  • ऑब्जेक्ट सिंटैक्स सिंटैक्स जावास्क्रिप्ट ऑब्जेक्ट बनाने के लिए एक बहुत ही सुविधाजनक तरीका है
  • JSONभाषा है, जो 'जावास्क्रिप्ट ऑब्जेक्ट नोटेशन' के लिए खड़ा है, अपने वाक्यविन्यास javascript ऑब्जेक्ट शाब्दिक वाक्य रचना से ली गई है। इसका उपयोग प्रोग्रामिंग लैंग्वेज स्वतंत्र टेक्सटाइल डेटा ट्रांसफर फॉर्मेट के रूप में किया जाता है।

उदाहरण:

जेएस ऑब्जेक्ट नोटेशन, जेएस में कोड में वस्तुओं को आसानी से बनाने के लिए उपयोग किया जाता है:

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 में सभी ऑब्जेक्ट कुंजी तार होना चाहिए। जावास्क्रिप्ट ऑब्जेक्ट कुंजियों में तार या संख्या हो सकती है

  • JSON में सभी तार "दोहरे उद्धरण" में उद्धृत किए जाने चाहिए। जबकि जावास्क्रिप्ट में सिंगल कोट्स और डबल कोट्स दोनों की अनुमति है। जावास्क्रिप्ट ऑब्जेक्ट संकेतन में कोई उद्धरण नहीं होने के बावजूद, वस्तु की चाबियाँ स्पष्ट रूप से तार के लिए डाली जाती हैं।

  • JSON में किसी फ़ंक्शन को ऑब्जेक्ट के मान के रूप में परिभाषित नहीं किया जा सकता है (क्योंकि यह जावास्क्रिप्ट विशिष्ट है)। जावास्क्रिप्ट में यह पूरी तरह से कानूनी है।

जावास्क्रिप्ट का निर्माण JSONवस्तु में:

JSONवस्तुओं को आसानी से जावास्क्रिप्ट में परिवर्तित किया जा सकता है और इसके निर्माण में JSONवस्तु का उपयोग करके इसके विपरीत जो जावास्क्रिप्ट अपने रनटाइम में प्रदान करता है। उदाहरण के लिए:

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

यहां एक आश्चर्यजनक अंतर है: आप undefinedjson में उपयोग नहीं कर सकते हैं और अपरिभाषित मूल्यों वाले सभी ऑब्जेक्ट फ़ील्ड के बाद गायब हो जाएंगे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) );

🙈🙉🙊

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.