2009-05-19 19 views
12

मैं फ़ायरफ़ॉक्स 3.5 बी 4 का उपयोग कर रहा हूं।क्या JSON.parse() को डबल उद्धरण की आवश्यकता है?

यह अलर्ट [वस्तु वस्तु], [वस्तु वस्तु]:

var jsonString = '[{"foo": "one", "bar": 1}, {"foo": "two", "bar": 2}]'; 
var jsonObjects = JSON.parse(jsonString); 
alert(jsonObjects); 

यह कोई खाली स्ट्रिंग अलर्ट, अर्थात jsonObjects रिक्त है।

var jsonString = "[{'foo': '1', 'bar': 2}, {'foo': '3', 'bar': 4}]"; 
var jsonObjects = JSON.parse(jsonString); 
alert(jsonObjects); 

इसी प्रकार अनगिनत संपत्ति नामों के लिए, यानी {foo: '1', bar: 2}।

क्या चल रहा है? क्या मुझे कुछ स्पष्ट याद आ रहा है, या JSON.parse के साथ डबल और सिंगल उद्धरण के बारे में कोई नियम है? सभी तीन संस्करण eval के साथ ठीक काम करते हैं।

उत्तर

28

जेएसओएन मानक डबल कोट्स जरूरी है।

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

बेशक, अधिकांश JSON पार्सर्स अधिक लचीले होते हैं, जो गैर-मानक विकल्पों (जैसे सिंगल कोट्स) की अनुमति देते हैं; लेकिन उस पर भरोसा मत करो।

+3

कहां कहता है कि शीर्ष संरचना एक वस्तु होनी चाहिए? [यह दस्तावेज़] (http://www.ietf.org/rfc/rfc4627.txt?number=4627) केवल एक सरणी का उदाहरण देता है, और [json.org] (http://json.org/) करता है इस आवश्यकता को निर्दिष्ट करने के लिए प्रतीत नहीं होता है। – Brendon

+0

http://stackoverflow.com/a/4201631/977939 इसमें व्याख्या है: आरक्षित शब्द। – jpillora

2

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

+1

अगर आप इस कोड का उपयोग ऐड-ऑन में करने की योजना बनाते हैं तो eval का उपयोग न करें। – sdwilsh

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