2011-08-13 22 views
6

क्षमा करें अगर यह एक बेवकूफ सवाल है, यह मेरी पहली जे एस परियोजना ...JSON.parse, जे एस typecasting, और revivers

मैं JSON का उपयोग कर जे एस में एक कस्टम वस्तु deserialize करने के लिए कोशिश कर रहा हूँ है। समस्या यह है कि JSON.parse() ऑब्जेक्ट को मूल प्रकार के रूप में वापस नहीं करता है। चूंकि वांछित वस्तु को सीधे वांछित प्रकार पर कास्टिंग करना संभव नहीं लगता है, जो मुझे 'रिवाइवर' विकल्प के साथ छोड़ देता है ...

क्या मुझे यहां कुछ याद आ रही है? वस्तुओं को क्रमबद्ध और deserialize करने के लिए कस्टम तरीकों को लिखने से बचने के लिए JSON का पूरा बिंदु नहीं था? JSON का उपयोग करने का क्या मतलब है यदि मुझे अपनी ऑब्जेक्ट को 'ऑब्जेक्ट' को पुनर्जीवित करना है?

+0

'रिवरवर' [यहां] [1] का उपयोग करने के बारे में मेरा उत्तर देखें। [1]: http://stackoverflow.com/questions/14027168/how-to-load-json-into-a-function-rather-than-an-object/14028886#answer-14028886 –

उत्तर

9

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

यदि आपके पास "कक्षा" जैसे अन्य नोटेशन थे तो अचानक यह विशिष्ट भाषाओं या कोडबोसेस से बहुत बाध्य हो जाता है, और इसकी व्यापक और सामान्य प्रयोज्यता खो जाती है।

तो जेएसओएन को सरल कच्चे डेटा के रूप में सोचें। JSON उदाहरण marshalling या पूर्ण ऑब्जेक्ट serialization नहीं है। तो हाँ, यदि आप रचनाकारों से तत्काल जेएस ऑब्जेक्ट्स को क्रमबद्ध करना चाहते हैं तो आपको "रिवर्स" लिखने की आवश्यकता है।

new Book({ 
    title: "One Thousand and One Nights", 
    author: "Scheherazade" 
}); 

आप बस अपनी पसंद के निर्माता के लिए कॉल करने के लिए डेटा के अपने सादे वस्तु (अपने JSON.parse() के परिणाम) पारित:

यह दृष्टिकोण things like backbone.js take है। वहां से आप अपनी नई वस्तु में अपने मूल्यों को पढ़ने के लिए कुछ भी चीजें कर सकते हैं।

उदाहरण के लिए जावास्क्रिप्ट में Marhsal.dump(obj) के साथ रूबी में पूरी तरह से मार्शलिंग का कोई मानक तरीका नहीं है।


संपादित करें: एक अंतिम प्रमुख बिंदु ...

जावास्क्रिप्ट वस्तुओं एक "प्रकार" की जरूरत नहीं है के रूप में आप अन्य भाषाओं में इसके बारे में सोचते हैं। जावास्क्रिप्ट ऑब्जेक्ट केवल कुंजी/मान जोड़े का एक शब्दकोश है। जब आप new SomeClass() जैसे कुछ करते हैं तो आपको एक नई वस्तु मिलती है, जिसमें एक विशेष prototype संपत्ति होती है जो फ़ंक्शन ऑब्जेक्ट की prototype संपत्ति को इंगित करती है। Wether एक ऑब्जेक्ट SomeClass का एक उदाहरण एक स्पष्ट कट प्रश्न से कम है जो आप पहली नज़र में सोच सकते हैं।

इसके बजाय आप पूछ सकते हैं "मेरा कन्स्ट्रक्टर फ़ंक्शन ऑब्जेक्ट क्या है?" या "मेरी प्रोटोटाइप श्रृंखला में कौन सी वस्तुएं हैं?"

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

मुद्दा यह है कि javascripts प्रोटोटाइप दृष्टिकोण इन्स्टेन्शियशन, यह के साथ संयुक्त आधारित शाब्दिक scoping और तथ्य यह है कि वस्तुओं और अधिक शाब्दिक मूल्यों से सी संकेत की तरह उनके मूल्यों पकड़ बंद है आपत्ति उठाने का है, यह करने के लिए पूरी तरह से serialize एक वस्तु बहुत बहुत मुश्किल बना देता है वीएम के बाहर एक स्थान के बाहर।

+0

इस दिलचस्प सवाल के स्पष्ट और सरल उत्तर के लिए +1। –

+1

तब तक स्पष्ट और सरल जब तक मैंने इसे अपने संपादन के साथ बैलॉक्स नहीं किया, जावास्क्रिप्ट "टाइपिंग" को समझाते हुए :) –

संबंधित मुद्दे