तकनीक "eval ()" और "JSON.parse ()" पारस्परिक रूप से अनन्य स्वरूपों का उपयोग करते हैं।
- "Eval ()" कोष्ठक के साथ आवश्यक हैं ।
- "JSON.parse ()" कोष्ठक के साथ निषिद्ध हैं ।
खबरदार, "निष्कासन" (प्रारूप) "फ़ंक्शंस" का निर्माण करते हैं। अजाक्स के लिए, आपको केवल JSON प्रारूप का उपयोग करना चाहिए।
जबकि "eval" संपूर्ण जावास्क्रिप्ट भाषा को शामिल करता है, JSON भाषा का केवल एक छोटा सा उपसमूह उपयोग करता है। जावास्क्रिप्ट भाषा में निर्माणों के बीच "eval" को पहचानना होगा "ब्लॉक स्टेटमेंट" (उर्फ "कंपाउंड स्टेटमेंट") ; जो एक जोड़ी है या घुंघराले ब्रेसिज़ "{}" के साथ कुछ कथन अंदर हैं। लेकिन घुंघराले ब्रेसिज़ का उपयोग ऑब्जेक्ट लिटरल के सिंटैक्स में भी किया जाता है। व्याख्या उस संदर्भ से भिन्न होती है जिसमें कोड दिखाई देता है। कुछ आपको वस्तु शाब्दिक लग सकता है, लेकिन "स्पष्ट" इसे एक यौगिक कथन के रूप में देखेंगे।
जावास्क्रिप्ट भाषा में, ऑब्जेक्ट शाब्दिक एक असाइनमेंट के दाईं ओर होते हैं।
var myObj = { ...some..code..here... };
ऑब्जेक्ट शाब्दिक अपने आप नहीं होते हैं।
{ ...some..code..here... }
ओपी के मूल प्रश्न पर वापस जाते हुए, 2008 में पूछा गया, उन्होंने पूछताछ की कि निम्नलिखित "निष्कासन ()" में विफल क्यों हैं:
{ title: "One", key: "1" }
इसका उत्तर यह है कि यह एक यौगिक कथन जैसा दिखता है। इसे एक वस्तु में बदलने के लिए, आपको इसे एक ऐसे संदर्भ में रखना होगा जहां एक यौगिक कथन असंभव है। यह चारों ओर कोष्ठक लगाकर किया जाता है
( { title: "One", key: "1" } )
ओपी ने यह भी पूछा कि इसी तरह के एक बयान ने सफलतापूर्वक क्यों निकाला:
[ { title: "One", key: "1" }, { title: "Two", key: "2" } ]
एक ही उत्तर लागू होता है - घुंघराले ब्रेसिज़ एक संदर्भ में होते हैं जहां एक यौगिक कथन असंभव है। यह एक सरणी संदर्भ है, " [...]
", और सरणियों में ऑब्जेक्ट्स हो सकते हैं, लेकिन उनमें कथन नहीं हो सकते।
"Eval ()" के विपरीत, JSON अपनी क्षमताओं में बहुत सीमित है। सीमा जानबूझकर है। JSON के डिजाइनर ने केवल सिंटैक्स का उपयोग करके जावास्क्रिप्ट के एक न्यूनतम उपसमुच्चय का इरादा किया, जो एक असाइनमेंट के दाहिने हाथ की तरफ दिखाई दे सकता है। तो अगर आपके पास कुछ कोड है जो JSON में सही ढंग से पार्स करता है ...
var myVar = JSON.parse("...some...code...here...");
... इसका तात्पर्य यह है कि यह किसी कार्य के दायीं ओर कानूनी रूप से पार्स होगा, इस तरह ।।
var myVar = ...some..code..here... ;
लेकिन यह केवल JSON पर प्रतिबंध नहीं है। JSON के लिए BNF भाषा विनिर्देश बहुत सरल है। उदाहरण के लिए, यह स्ट्रिंग (जैसे जावास्क्रिप्ट और पर्ल डू) को इंगित करने के लिए एकल उद्धरण के उपयोग की अनुमति नहीं देता है और इसके पास एक चरित्र को बाइट के रूप में व्यक्त करने का एक तरीका नहीं है (जैसे 'सी' करता है)। दुर्भाग्य से, यह भी टिप्पणियों की अनुमति नहीं देता है (जो विन्यास फाइल बनाते समय वास्तव में अच्छा होगा)। उन सभी सीमाओं का उल्टा यह है कि JSON को पार्स करना तेज है और कोड इंजेक्शन (एक सुरक्षा खतरा) के लिए कोई अवसर प्रदान नहीं करता है।
इन सीमाओं के कारण, JSON का कोष्ठक के लिए कोई उपयोग नहीं है। नतीजतन, JSON स्ट्रिंग में एक कोष्ठक एक अवैध चरित्र है।
निम्नलिखित कारणों से हमेशा JSON प्रारूप का उपयोग करें
- JSON के लिए एक विशिष्ट अजाक्स पाइपलाइन को कॉन्फ़िगर किया जाएगा।
- एक सुरक्षा जोखिम के रूप में "eval ()" के उपयोग की आलोचना की जाएगी।
एक अजाक्स पाइपलाइन के उदाहरण के रूप में, एक प्रोग्राम पर विचार करें जिसमें एक नोड सर्वर और एक jQuery क्लाइंट शामिल है। क्लाइंट प्रोग्राम फॉर्म वाले jQuery कॉल का उपयोग करता है $.ajax({dataType:'json',...etc.});
। JQuery बाद में उपयोग के लिए एक jqXHR ऑब्जेक्ट बनाता है, फिर पैकेज और संबंधित अनुरोध भेजता है। सर्वर अनुरोध को स्वीकार करता है, इसे संसाधित करता है, और फिर प्रतिक्रिया देने के लिए तैयार होता है। सर्वर प्रोग्राम res.json(data)
पैकेज को विधि को कॉल करेगा और प्रतिक्रिया भेजेगा। क्लाइंट की तरफ वापस, jQuery प्रतिक्रिया को स्वीकार करता है, संबंधित jXXHR ऑब्जेक्ट को सुरक्षित करता है, और JSON स्वरूपित डेटा को संसाधित करता है। यह सब मैन्युअल डेटा रूपांतरण की आवश्यकता के बिना काम करता है। प्रतिक्रिया में नोड सर्वर पर JSON.stringify () और क्लाइंट पर JSON.parse () के लिए कोई स्पष्ट कॉल शामिल नहीं है; यह सब आपके लिए है।
"Eval" का उपयोग कोड इंजेक्शन सुरक्षा जोखिमों के साथ जुड़ा हुआ है। आप सोच सकते हैं कि ऐसा कोई तरीका नहीं है जो हो सकता है, लेकिन हैकर्स काफी रचनात्मक हो सकते हैं। इसके अलावा, "eval" जावास्क्रिप्ट अनुकूलन के लिए समस्याग्रस्त है।
यदि आप एक "स्ट्रिफ़ाइज़र ()" फ़ंक्शन का उपयोग करके खुद को पाते हैं, तो ध्यान रखें कि उस नाम के साथ कुछ फ़ंक्शन स्ट्रिंग्स बनाएंगे जो "eval" के साथ संगत हैं और JSON के साथ नहीं। उदाहरण के लिए, नोड में, निम्नलिखित आपको फ़ंक्शन देता है जो "इवैल" संगत प्रारूप में तार बनाता है:
var stringify = require('node-stringify');
यह उपयोगी हो सकता है, लेकिन जब तक आपको कोई विशिष्ट आवश्यकता नहीं होती है, यह संभवतः वह नहीं है जो आप चाहते हैं।