जावास्क्रिप्ट ऑब्जेक्ट बनाम JSON


208

मैं जावास्क्रिप्ट ऑब्जेक्ट और JSON स्ट्रिंग के बीच बुनियादी अंतरों को स्पष्ट रूप से समझना चाहता हूं।

मान लीजिए कि मैं निम्नलिखित JS वैरिएबल बनाता हूं:

var testObject = {one: 1,"two":2,"three":3};

Q1। क्या कुंजी / संपत्ति का नाम दोनों उद्धरणों के साथ / बिना मान्य है? (उदा "one" : 1)

यदि हाँ, तो क्या अंतर है?

Q2: यदि मैं उपरोक्त ऑब्जेक्ट का उपयोग करके परिवर्तित करता हूं JSON.stringify(testObject), तो मूल JS ऑब्जेक्ट और JSON के बीच क्या अंतर है?

मुझे लगता है कि वे लगभग समान हैं। कृपया इस पर विस्तार से बताएं।

Q3: JSON स्ट्रिंग पार्स करने के लिए, नीचे दी गई विधि है?

var javascriptObj = JSON.parse(jSonString);

जवाबों:


239
  1. क्या कुंजी / संपत्ति का नाम दोनों उद्धरणों के साथ / बिना मान्य है?

    केवल समय आप जब वस्तु शाब्दिक अंकन का उपयोग उद्धरण में एक महत्वपूर्ण शामिल करनी जहां कुंजी विशेष वर्ण (होता है if, :, -आदि)। यह ध्यान देने योग्य है कि JSON में एक कुंजी को दोहरे उद्धरण चिह्नों में संलग्न किया जाना चाहिए ।

  2. अगर मैं उपरोक्त वस्तु को JSON का उपयोग करके परिवर्तित करता हूं var jSonString = JSON.stringify(testObject);, तो 2 (JS obj और JSON) में क्या अंतर है?

    JSON एक डाटा इंटरचेंज फॉर्मेट है। यह एक मानक है जो बताता है कि कैसे सूचियों और अनियंत्रित नक्शे, स्ट्रिंग बूलियन और संख्याओं को एक स्ट्रिंग में दर्शाया जा सकता है। XML और YAML की तरह भाषाओं के बीच संरचित जानकारी को पारित करने का एक तरीका है, JSON समान है। दूसरी ओर एक जावास्क्रिप्ट ऑब्जेक्ट एक भौतिक प्रकार है। एक PHP सरणी की तरह, एक C ++ क्लास / स्ट्रक्चर, एक जावास्क्रिप्ट ऑब्जेक्ट जावास्क्रिप्ट के लिए आंतरिक एक प्रकार है।

    यहाँ एक कहानी है। आइए कल्पना करें कि आपने स्टोर से कुछ फर्नीचर खरीदे हैं, और आप इसे वितरित करना चाहते हैं। हालाँकि, स्टॉक में केवल एक ही डिस्प्ले मॉडल है, लेकिन आप इसे खरीदने के लिए सहमत हैं।

    दुकान में, आपके द्वारा खरीदी गई छाती की दराज एक जीवित वस्तु है:

    var chestOfDrawers = {
        color: "red",
        numberOfDrawers: 4
    }

    हालाँकि, आप पोस्ट में एक चेस्ट-ऑफ-ड्रॉर्स नहीं भेज सकते हैं, इसलिए आप इसे विघटित करते हैं (पढ़ें, इसे कठोर करें)। यह अब फर्नीचर के मामले में बेकार है। यह अब JSON है। फ्लैट पैक रूप में इसका।

    {"color":"red","numberOfDrawers":4}

    जब आप इसे प्राप्त करते हैं, तो आप फिर से छाती की दराज का पुनर्निर्माण करते हैं (पढ़ें, इसे पार्स करें)। यह अब एक वस्तु के रूप में वापस आ गया है।

    JSON / XML और YAML के पीछे का कारण यह है कि डेटा को प्रोग्रामिंग भाषाओं के बीच एक प्रारूप में स्थानांतरित किया जा सकता है जो दोनों भाग लेने वाली भाषाओं को समझ सकते हैं; आप सीधे PHP या C ++ को अपनी जावास्क्रिप्ट ऑब्जेक्ट नहीं दे सकते; क्योंकि प्रत्येक भाषा किसी वस्तु को अलग-अलग प्रकार से दर्शाती है। हालाँकि, क्योंकि हमने JSON संकेतन में ऑब्जेक्ट को कड़ा कर दिया है; यानी डेटा को दर्शाने के लिए एक मानकीकृत तरीका, हम ऑब्जेक्ट के JSON प्रतिनिधित्व को दूसरे लैंगगॉउ (C ++, PHP) तक पहुंचा सकते हैं, वे जावास्क्रिप्ट ऑब्जेक्ट को फिर से बना सकते हैं, जो कि ऑब्जेक्ट के JSON प्रतिनिधित्व के आधार पर उनकी अपनी वस्तु में था ।

    यह ध्यान रखना महत्वपूर्ण है कि JSON फ़ंक्शन या दिनांक का प्रतिनिधित्व नहीं कर सकता है। यदि आप किसी फ़ंक्शन सदस्य के साथ ऑब्जेक्ट को स्ट्रिंग करने का प्रयास करते हैं, तो फ़ंक्शन को JSON प्रतिनिधित्व से छोड़ दिया जाएगा। एक तारीख एक स्ट्रिंग में बदल जाएगी;

    JSON.stringify({
        foo: new Date(),
        blah: function () { 
            alert('hello');
        }
    }); // returns the string "{"foo":"2011-11-28T10:21:33.939Z"}"
  3. JSON स्ट्रिंग को पार्स करने के लिए, नीचे दी गई विधि है? var javascriptObj = JSON.parse(jSonString);

    हां, लेकिन पुराने ब्राउज़र JSON को मूल रूप से समर्थन नहीं करते हैं (IE <8) । इनका समर्थन करने के लिए, आपको शामिल करना चाहिए json2.js

    यदि आप jQuery का उपयोग कर रहे हैं, तो आप कॉल कर सकते हैं jQuery.parseJSON(), जो JSON.parse()हुड के नीचे उपयोग करेगा यदि यह समर्थित है और अन्यथा इनपुट को पार्स करने के लिए एक कस्टम कार्यान्वयन के लिए वापस आ जाएगा।


4
@testndtv आपको वह बिंदु याद आ रहा है - हालाँकि कागज पर (या स्क्रीन पर) एक JSON स्ट्रिंग और एक JS ऑब्जेक्ट का प्रदर्शन समान दिख सकता है , वे एक ही चीज़ नहीं हैं। JSON किसी ऑब्जेक्ट को स्ट्रिंग में पैक करने का एक तरीका है, इसलिए इसे कहीं स्थानांतरित किया जा सकता है और बाद में किसी ऑब्जेक्ट में वापस पैक किया जा सकता है।
अलनीतक

1
@Matt खराब सादृश्य IMHO - JSON का उपयोग किसी ऐसी वस्तु को क्रमबद्ध करने के लिए नहीं किया जाना चाहिए जिसमें केवल शुद्ध डेटा ऑब्जेक्ट्स के लिए विधियाँ हों।
अलनीतक

1
इसलिए यदि कोई JS ऑब्जेक्ट मेथड है, JSON स्ट्रिंग में परिवर्तित करेगा तो इसे पूरी तरह से अनदेखा कर देगा ... जैसे कि उपरोक्त मामले में getIn और getOut को पूरी तरह से नजरअंदाज कर दिया जाएगा .... क्या यह है कि यह कैसे काम करता है?
testndtv

3
@Growler: आमतौर पर मैं JSON का उपयोग करता हूं यदि "चीज़" को सर्वर पर उत्पन्न करने की आवश्यकता होती है , और यदि "चीज़" को बस के रूप में परोसा जाता है, तो एक js फ़ाइल का उपयोग करें । दूसरा बड़ा विभेदक यह है कि क्या आपको फ़ंक्शन और / या तिथियों को शामिल करने की आवश्यकता है, क्योंकि JSON उनका प्रतिनिधित्व नहीं कर सकता है, इसलिए आपको एक JS फाइल परोसना चाहिए। यदि आप अभी भी अनिश्चित हैं, तो इसे स्टैक ओवरफ्लो पर एक अलग प्रश्न के रूप में पूछने के लिए स्वतंत्र महसूस करें (अपने संवाद का प्रतिनिधित्व करने के लिए आपको जो सामग्री प्रदान करने की आवश्यकता है, उसका एक उदाहरण दिखाएं), और लिंक के साथ मुझे पसंद करें; मैं करीब से देखने के लिए खुश हूँ!
मैट

4
@ मट यू सर, अफ # किंग जीनियस हैं! आपका स्पष्टीकरण स्पष्ट, संक्षिप्त और समझने में आसान है। काश आप मेरे जावास्क्रिप्ट / प्रोग्रामिंग गुरु होते।
फ्रैंकड्र्स 14

30

Q1: जब जावास्क्रिप्ट में ऑब्जेक्ट शाब्दिक को परिभाषित करते हैं, तो कुंजियों में उद्धरण शामिल हो सकते हैं या नहीं। इसमें कोई अंतर नहीं है कि उद्धरण आपको कुछ कुंजी निर्दिष्ट करने की अनुमति देते हैं जो दुभाषिया को पार्स करने में विफल होने का कारण बनेगी यदि आपने उन्हें नंगे करने की कोशिश की। उदाहरण के लिए, यदि आप एक कुंजी चाहते थे जो केवल एक विस्मयादिबोधक बिंदु थी, तो आपको उद्धरण चिह्नों की आवश्यकता होगी:

a = { "!": 1234 } // Valid
a = { !: 1234 } //  Syntax error

हालांकि ज्यादातर मामलों में, आप ऑब्जेक्ट शाब्दिक रूप से कुंजियों के आसपास उद्धरणों को छोड़ सकते हैं।

Q2: JSON सचमुच एक स्ट्रिंग प्रतिनिधित्व है। यह सिर्फ एक तार है। तो, इस पर विचार करें:

var testObject = { hello: "world" }
var jSonString = JSON.stringify(testObject);

चूंकि testObjectएक वास्तविक वस्तु है, आप इस पर गुण कह सकते हैं और वस्तुओं के साथ कुछ भी कर सकते हैं:

testObject.hello => "world"

दूसरी ओर, jsonStringसिर्फ एक स्ट्रिंग है:

jsonString.hello => undefined

एक अन्य अंतर पर ध्यान दें: JSON में, सभी कुंजियों को उद्धृत किया जाना चाहिए। यह वस्तु शाब्दिक के विपरीत है, जहां क्यू 1 में मेरे स्पष्टीकरण के अनुसार आमतौर पर उद्धरण छोड़ा जा सकता है।

Q3। आप एक JSON स्ट्रिंग का उपयोग करके पार्स कर सकते हैं JSON.parse, और यह आम तौर पर ऐसा करने का सबसे अच्छा तरीका है (यदि ब्राउज़र या एक ढांचा इसे प्रदान करता है)। evalJSON मान्य जावास्क्रिप्ट कोड होने के बाद से आप भी इसका उपयोग कर सकते हैं , लेकिन पूर्व विधि कई कारणों से अनुशंसित है (eval में बहुत सारी समस्याएँ जुड़ी हैं)।


9

JSON द्वारा हल की गई समस्याएं

मान लें कि आप दो कंप्यूटरों के बीच नियमित जावास्क्रिप्ट ऑब्जेक्ट का आदान-प्रदान करना चाहते हैं, और आपने दो नियम निर्धारित किए हैं:

  • प्रेषित डेटा एक नियमित स्ट्रिंग होना चाहिए।
  • केवल विशेषताओं का आदान-प्रदान किया जा सकता है, तरीकों को प्रेषित नहीं किया जाता है।

अब आप पहले होस्ट पर दो ऑब्जेक्ट बनाते हैं:

var obj1 = { one: 1,"two":2,"three":3 }; // your example
var obj2 = { one: obj1.one, two: 2, three: obj1.one + obj1.two };

आप उन वस्तुओं को दूसरे होस्ट में संचरण के लिए तार में कैसे बदल सकते हैं?

  • पहले ऑब्जेक्ट के लिए, आप इस स्ट्रिंग को शाब्दिक परिभाषा प्राप्त '{ one: 1,"two":2,"three":3 }'कर सकते हैं, लेकिन वास्तव में आप दस्तावेज़ के स्क्रिप्ट भाग में शाब्दिक नहीं पढ़ सकते हैं (कम से कम आसानी से नहीं)। इसलिए obj1और obj2वास्तव में उसी तरह से संसाधित किया जाना चाहिए।
  • आपको सभी विशेषताओं और उनके मूल्य की गणना करने और ऑब्जेक्ट शाब्दिक के समान एक स्ट्रिंग बनाने की आवश्यकता है।

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

JSON विशेषता नामों और मूल्यों के लिए दोहरे उद्धरण चिह्नों के उपयोग को सामान्य करता है।

याद रखें कि JSON केवल नियमों का एक सेट (एक मानक) है।

कितने JSON ऑब्जेक्ट बनाए जाते हैं?

केवल एक, यह जेएस इंजन द्वारा स्वचालित रूप से बनाया गया है।

ब्राउज़रों में पाए जाने वाले आधुनिक जावास्क्रिप्ट इंजनों में एक देशी वस्तु होती है, जिसे JSON भी कहा जाता है। यह JSON ऑब्जेक्ट करने में सक्षम है:

  • JSON.parse (स्ट्रिंग) का उपयोग करके JSON मानक का उपयोग करके निर्मित स्ट्रिंग को डिकोड करें। परिणाम JSON स्ट्रिंग में पाए जाने वाले विशेषताओं और मूल्यों के साथ एक नियमित JS ऑब्जेक्ट है।

  • JSON.stringify () का उपयोग करके एक नियमित जेएस ऑब्जेक्ट की विशेषताओं / मूल्यों को एनकोड करें। परिणाम नियमों के JSON सेट के साथ एक स्ट्रिंग अनुपालन है।

(सिंगल) JSON ऑब्जेक्ट एक कोडेक के समान है, यह फ़ंक्शन एन्कोड और डीकोड करने के लिए है।

ध्यान दें कि:

  • JSON.parse () एक JSON ऑब्जेक्ट नहीं बनाता है, यह एक नियमित JS ऑब्जेक्ट बनाता है, एक ऑब्जेक्ट शाब्दिक और JSON.parse () द्वारा बनाई गई ऑब्जेक्ट JSON- कंप्लेंट स्ट्रिंग का उपयोग करके बनाई गई ऑब्जेक्ट के बीच कोई अंतर नहीं है।

  • केवल एक JSON ऑब्जेक्ट है, जिसका उपयोग सभी रूपांतरणों के लिए किया जाता है।

प्रश्नों पर वापस जाना :

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

  • Q2: ऑब्जेक्ट्स शाब्दिक रूप से बनाए गए और JSON.parse () का उपयोग करके कड़ाई से समान हैं। निर्माण के बाद ये दोनों वस्तुएं बराबर हैं:

    var obj1 = { one: 1, "two": 2, "three": 3 };
    var obj2 = JSON.parse('{ "one": "1", "two": "2", "three": "3" }');

  • Q3: आधुनिक ब्राउज़रों पर JSON.parse()JSON-compliant string से JS ऑब्जेक्ट बनाने के लिए उपयोग किया जाता है। (jQuery के पास एक समान विधि भी है जिसका उपयोग सभी ब्राउज़रों के लिए किया जा सकता है)।


7

क्यू 1 - जेएस में आपको केवल उद्धरण का उपयोग करने की आवश्यकता है यदि कुंजी एक आरक्षित शब्द है या यदि यह अन्यथा एक अवैध टोकन होगा। JSON में आप हमेशा प्रमुख नामों पर दोहरे उद्धरण चिह्नों का उपयोग करते हैं।

Q2 - jsonStringएक है धारावाहिक इनपुट वस्तु के संस्करण ...

Q3 - जिसका उपयोग कर एक समान दिखने वाली वस्तु को deserialised किया जा सकता हैJSON.parse()


1

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

// Valid JSON strings(Observe quotes)
valid_json = '{"key":"value"}'
valid_json_2 = '{"key 1":"value 1"}' // Observe the space(special character) in key - still valid


//Valid Javascript object
valid_javascript_object_no_quotes = {
    key: "value"  //No special character in key, hence it is valid without quotes for key
}


//Valid Javascript object
valid_javascript_object_quotes = {
    key:"value",  //No special character in key, hence it is valid without quotes for key
    "key 1": "value 1" // Space (special character) present in key, therefore key must be contained in double quotes  - Valid
}



console.log(typeof valid_json) // string
console.log(typeof valid_javascript_object_no_quotes) // object
console.log(typeof valid_javascript_object_quotes) // object

//Invalid Javascript object 
invalid_javascript_object_no_quotes = {
   key 1: "value"//Space (special character) present in key, since key is not enclosed with double quotes "Invalid Javascript Object"
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.