2010-09-29 12 views
5

निम्नलिखित कोड को ( और ) को eval के लिए जोड़ने की आवश्यकता क्यों है?JSON को निकालने के लिए हमें ब्रांड्स जोड़ने की आवश्यकता क्यों है?

var strJson = eval("(" + $("#status").val().replace(";","") + ")"); 

पुनश्च: $("#status").val() (एक अज्ञात) {"10000048":"1","25000175":"2","25000268":"3"};

+0

आप पहले स्थान पर 'eval' का उपयोग क्यों कर रहे हैं? बस इसके साथ चिपके रहें: 'var strJson = $ (" # स्थिति ")। वैल()। प्रतिस्थापित करें ("; "," ");' –

उत्तर

3

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')+')'); 
} 
4

की तरह कुछ लौटा रहा है यह निर्भर करता है कि क्या उस तत्व में मूल्य है, () में यह लपेटकर सुरक्षित मार्ग संभवतः की कोई इनपुट के लिए खाते में करने के लिए है मौजूद होना।

संपादित करें: अब जब कि तुम यह के JSON ऊपर साफ़ कर दिया है, यह मान्य है:

eval('{"10000048":"1","25000175":"2","25000268":"3"}'); 

लेकिन यह एक वैध वस्तु का परिणाम देगा लौटाए जाने: एक में

eval('({"10000048":"1","25000175":"2","25000268":"3"})'); 
//effectively: 
eval('return {"10000048":"1","25000175":"2","25000268":"3"};'); 

चित्र JavaScript फ़ाइल:

<script type="text/javascript"> 
    {"10000048":"1","25000175":"2","25000268":"3"} 
</script> 

यह विफल रहा है, यह सिर्फ एक वस्तु इनलाइन घोषित लेकिन नहीं उचित सिंटैक्स ... उसी कारण एक सर्वर में काम करने के लिए JSONP का समर्थन करने के लिए है।


सवाल का स्पर्शरेखा थोड़ा है, लेकिन जब से तुम jQuery सहित रहे हैं, आप के रूप में अच्छी $.parseJSON() (देशी JSON.parse() यदि उपलब्ध हो जो उपयोग किया जाएगा) का उपयोग कर सकते इस लिए:

var strJson = $.parseJSON($("#status").val().replace(";","")); 
+0

हाय वैल() लौटाया गया है {"10000048": "1 "" 25000175 ":" 2 "," 25,000,268 ":" 3 "}; – Ricky

+0

पहला कथन क्यों अमान्य है – Ricky

+0

@ रिकी - यह केवल उसी कारण के लिए वैध वाक्यविन्यास नहीं है, यह सीधे लिपि में नहीं है, क्योंकि पार्सर इसे अभिव्यक्ति के रूप में नहीं देख रहा है जबकि '()' प्रभावी रूप से एक वापसी विवरण है (चूंकि यह एक अभिव्यक्ति पर स्विच करता है, 'ऑब्जेक्ट स्टार्ट के रूप में '{' को पहचानता है, जिस ऑब्जेक्ट की आप परवाह करते हैं उसे प्राप्त/वापस कर रहा है)। –

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