eval
लेता है एक जावास्क्रिप्ट कथन या अभिव्यक्ति, लेकिन {...}
एक अभिव्यक्ति या अभिव्यक्ति के रूप में मान्य होगी, और जावास्क्रिप्ट का व्याकरण एक बयान पसंद करता है।
एक अभिव्यक्ति के रूप में:
{"10000048":"1","25000175":"2","25000268":"3"}
कुछ गुण (आप क्या चाहते हैं) के साथ एक वस्तु है।
{ // begin Block
"10000048": // LabelledStatement (but the quotes are invalid)
"1", // Expression, calculate string "1" then discard it, then
"25000175": // you can't put a label inside an expression
जो एक त्रुटि देता है:
एक बयान के रूप में, यह एक ब्लॉक है।
तो कोष्ठकों जोड़कर आप अस्पष्टता को हल (जावास्क्रिप्ट लेबल break
/continue
साथ प्रयोग के लिए एक विशेष बयान लेबल करने के लिए इस्तेमाल किया जा सकता। वे थोड़ा व्यर्थ और लगभग इस्तेमाल कभी नहीं कर रहे हैं।)। केवल एक अभिव्यक्ति (
से शुरू हो सकती है, इसलिए सामग्री को एक अभिव्यक्ति संदर्भ में पार्स किया जाता है, जिससे ऑब्जेक्ट शाब्दिक होता है, बयान संदर्भ नहीं।
संयोग से यह नहीं है जो सभी संभावित JSON मानों को सही ढंग से समझने के लिए पर्याप्त है। जेएसओएन के डिजाइन में एक निरीक्षण के कारण, यू +2028 और यू +2029 के पात्र, दो अस्पष्ट यूनिकोड लाइन-एंडिंग वर्ण, जेएसओएन स्ट्रिंग शाब्दिक में अनचाहे रखने के लिए मान्य हैं, लेकिन जावास्क्रिप्ट स्ट्रिंग में नहीं।अगर आप सुरक्षित रहना चाहते हैं, तो आप उन्हें बच सकते हैं, उदाहरण के लिए:
function parseJSON(s) {
if ('JSON' in window) return JSON.parse(s);
return eval('('+s.replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029')+')');
}
आप पहले स्थान पर 'eval' का उपयोग क्यों कर रहे हैं? बस इसके साथ चिपके रहें: 'var strJson = $ (" # स्थिति ")। वैल()। प्रतिस्थापित करें ("; "," ");' –