2012-09-11 18 views
12

मैं जेएसओएन पार्सिंग के एक उचित बिट के साथ काम कर रहा हूं और हाल ही में नोड.जेएस और ब्राउज़रों के भीतर जावास्क्रिप्ट में गुजर रहा हूं और इस कन्डर्रम में घुस गया हूं।JSON.stringify प्रोटोटाइप मानों को क्रमबद्ध क्यों नहीं कर रहा है?

किसी भी निर्माता जो मैंने कन्स्ट्रक्टर का उपयोग करके बनाया है, पूरी तरह से JSON.stringify के माध्यम से पूरी तरह से क्रमबद्ध नहीं किया जा सकता है, UNLESS मैंने व्यक्तिगत रूप से निर्माता के भीतर सभी मानों को प्रारंभ किया! इसका मतलब है कि इन वर्गों को डिजाइन करने में मेरा प्रोटोटाइप अनिवार्य रूप से बेकार हो जाता है।

क्या कोई इस बात पर कुछ प्रकाश डाल सकता है कि निम्न उम्मीदों के अनुसार निम्नलिखित क्यों क्रमबद्ध नहीं है?

var ClassA = function() { this.initialisedValue = "You can see me!" }; 
ClassA.prototype = { initialisedValue : "You can't see me!", uninitialisedValue : "You can't see me!" }; 
var a = new ClassA(); 
var a_string = JSON.stringify(a); 

क्या होता है:

a_string == { "initialisedValue": "आप मुझे देख सकते हैं!" }

मैं उम्मीद करेंगे:

a_string == { "initialisedValue": "आप मुझे देख सकते हैं!", "UninitialisedValue": "आप नहीं मुझे देख सकते हैं!" }

+0

संभव डुप्लिकेट [? कैसे JSON को विरासत में मिली वस्तुओं stringify करने के लिए] (http://stackoverflow.com/questions/8779249/how-to-stringify-inherited-objects-to-json) – lonesomeday

+0

http://stackoverflow.com/questions/5790620/how-to-stringify-a-whole- जावास्क्रिप्ट-ऑब्जेक्ट-सहित-प्रोटो-गुण – speg

+0

मैं समझता हूं कि जेएसओएन के माध्यम से तरीकों को क्रमबद्ध नहीं किया जा सकता है, लेकिन धन्यवाद, जैसा कि आपने मुझे एक चर्चा के लिए इंगित किया है इसे बाहर करो। जाहिर है यह एक दस्तावेज 'मुद्दा' है, यह सुनिश्चित नहीं है कि मेरी खोजों ने इसे क्यों नहीं लाया। धन्यवाद! – killercowuk

उत्तर

14

बस क्योंकि जेएसओएन काम करता है। ES5 spec से:

Let कश्मीर सब खुद गुण मान जिसकी [[Enumerable]] विशेषता सच है की के नाम से मिलकर तार का एक आंतरिक सूची हो।

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

{"प्रारंभिक वैल्यू": "आप मुझे देख सकते हैं!", "UninitialisedValue": "आप मुझे नहीं देख सकते!" }

2 कुंजी-मूल्य जोड़े वाले फ्लैट ऑब्जेक्ट के अलावा किसी अन्य चीज़ में इसे पार्स करने के लिए कोई जानकारी नहीं है।

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

ये [हैश टेबल और सरणी] सार्वभौमिक डेटा संरचनाएं हैं। लगभग सभी आधुनिक प्रोग्रामिंग भाषाएं उन्हें एक रूप में या किसी अन्य रूप में समर्थन देती हैं। यह समझ में आता है कि प्रोग्रामिंग भाषाओं के साथ एक परिवर्तनीय डेटा प्रारूप भी इन संरचनाओं पर आधारित होगा।

+0

धन्यवाद जेम्स, मुझे लगता है कि यह इस मुद्दे को बिस्तर पर रखता है। मेरे मामले में प्रोटोटाइप अनिवार्य रूप से बेकार के रूप में शर्म आती है! तब ब्लोटी कन्स्ट्रक्टर का सहारा लेना होगा! – killercowuk

+0

@ किल्लरकोक - आप अपनी वस्तुओं के लिए अपने स्वयं के कड़े प्रारूप के साथ आ सकते हैं। मैंने इसके जवाबों के पीछे कुछ और तर्क शामिल करने के लिए अपना जवाब संपादित कर लिया है। –

+0

चीयर्स जेम्स, मुझे तर्कसंगत लगता है, हालांकि संक्षेप में JSON - जावास्क्रिप्ट ऑब्जेक्ट नोटेशन द्वारा थोड़ा मिसाल्ड महसूस होता है; हालांकि पूरी तरह से सराहना करते हैं कि यह मूल रूप से "हल्के डेटा-इंटरचेंज प्रारूप" (json.org) है – killercowuk

0

मैं इस पृष्ठ में उतरा नेवला का उपयोग करते समय: यदि अन्य उपयोगकर्ताओं के समान समस्या आती है, निम्नलिखित प्रश्न (और संबंधित जवाब) उपयोगी हो सकता है:

How do you turn a Mongoose document into a plain object?

(मूल रूप से: का उपयोग मॉडल के toObject() विधि)

0

मैं इसे जोड़ना चाहता हूं, भले ही JSON.stringify केवल ऑब्जेक्ट की अपनी गुणों को स्ट्रिंग करेगा, जैसा कि स्वीकृत उत्तर में बताया गया है, आपकी सरणी निर्दिष्ट करके स्ट्रिंगफिकेशन प्रक्रिया के व्यवहार को बदल सकते हैंJSON.stringify के दूसरे पैरामीटर के रूप में (एक replacer सरणी कहा जाता है)।

यदि आप स्ट्रिंग करने के लिए गुणों की श्वेतसूची के साथ String की सरणी निर्दिष्ट करते हैं, तो स्ट्रिंग एल्गोरिदम इसके व्यवहार को बदल देगा और यह प्रोटोटाइप श्रृंखला में गुणों पर विचार करेगा।

ES5 spec से:

  1. तो PropertyList अपरिभाषित नहीं है, तो

    एक। के प्रॉपर्टीलिस्ट बनें।

  2. वरना

    एक

    । K को के नामों के सभी गुणों के साथ स्ट्रिंग्स की एक आंतरिक सूची दें, जिनकी [[गणना करने योग्य]] विशेषता सत्य है। स्ट्रिंग्स का क्रम ऑब्जेक्ट.की मानक मानक अंतर्निहित फ़ंक्शन के समान होना चाहिए।

आप ऑब्जेक्ट के गुणों का नाम जानते हैं पहले से stringify के लिए, आप कुछ इस तरह कर सकते हैं:

var a_string = JSON.stringify(a, ["initialisedValue", "uninitialisedValue"]); 
// a_string == { "initialisedValue" : "You can see me!", "uninitialisedValue" : "You can't see me!" } 
की
संबंधित मुद्दे