2012-04-09 14 views
30

जैसा कि this jsfiddle में दिखाया गया है, यदि आपके पास एक जेएस फ़ाइल है और आप इसका उपयोग किए बिना JSON ऑब्जेक्ट बनाते हैं, तो यह अलग-अलग व्यवहार करता है कि कुंजी (सदस्यों) में लपेटा गया है या नहीं उद्धरण या नहीं।जेएस में अजीब JSON पार्सिंग व्यवहार, "अप्रत्याशित टोकन:"

मान्य कोड: { a: 1};
अमान्य कोड: { "a": 1 };

क्या आप मिल जाएगा एक त्रुटि संदेश है (क्रोम में, एफएफ/IE के लिए अलग-अलग, लेकिन अभी भी वाक्य रचना पर विफल रहता है)

Uncaught SyntaxError: Unexpected token :

लेकिन यदि आप ऑब्जेक्ट का किसी भी तरीके से उपयोग करते हैं, उदाहरण के लिए: alert({ "a": 1 }); सब कुछ ठीक है।

ऐसा क्यों होता है?

उत्तर

53

बयान:

{ a: 1 }; 

नहीं एक वस्तु शाब्दिक है। यह एक ब्लॉक स्टेटमेंट है जिसमें एक लेबल वाली अभिव्यक्ति है। यह मान्य है।

यह: यह सिर्फ parseable नहीं है क्योंकि

{ "a": 1 }; 

एक सिंटैक्स त्रुटि है। उद्धृत "ए" ब्लॉक के अंदर एक अभिव्यक्ति कथन शुरू करता है, लेकिन फिर स्ट्रिंग के बाद अगला टोकन एक कोलन है, और कोई अभिव्यक्ति फ़ॉर्म नहीं है जो एक कोलन के बाद अभिव्यक्ति जैसा दिखता है।

अब

:

var x = { "a": 1 }; 

काम करता है क्योंकि "{" एक ब्लॉक बयान की शुरुआत के रूप में व्याख्या नहीं है। यह कथन var के साथ शुरू होता है, इसलिए यह एक परिवर्तनीय घोषणा है। "=" टोकन के दाईं ओर अभिव्यक्ति के भीतर, एकमात्र चीज जिसे "{" का अर्थ हो सकता है वह एक वस्तु का प्रारंभिक है। ,

({ "a": 1 }); 

ठीक है क्योंकि आरंभिक कोष्ठक पार्सर एक नेस्टेड उपसूचक उम्मीद करता है तो फिर "{" स्पष्ट रूप से मतलब है कि यह एक वस्तु शाब्दिक की शुरुआत है: इसी तरह, ध्यान दें कि।

+0

लेकिन इसे एक var को असाइन करने से यह एक वस्तु को शाब्दिक बनाता है? – karnyj

+0

हां, क्योंकि कोई अस्पष्टता नहीं है। – Pointy

+5

जावास्क्रिप्ट आंतरिक वास्तव में कुछ हैं :) धन्यवाद – karnyj

2

यह त्रुटि jsonp का उपयोग कर jQuery AJAX कॉल करते समय पॉपअप कर सकती है जब jsonp आवश्यक नहीं है। आपके AJAX कॉल पर अपने डेटा प्रकार स्विचन अगर यह सामान्य json

$.ajax({ 
    dataType: 'json', // try using json rather than json p 
    ... 
}); 
0

को मामला है मैं तो बस जब require के माध्यम से JSON लोड हो रहा है की तुलना में महसूस किया और फ़ाइल नाम .json मैं इस त्रुटि मिलती है पर अंत नहीं है की कोशिश करो। फ़ाइल को bla.json पर पुनर्नामित करना और यह ठीक काम करता है।

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