2010-12-14 13 views
7

मैं एक स्ट्रिंग में जावास्क्रिप्ट/jquery में एक स्ट्रिंग कैसे परिवर्तित कर सकता हूं?मैं जावास्क्रिप्ट में किसी फ़ंक्शन में JSON स्ट्रिंग को कैसे परिवर्तित करूं?

मैं फ़ंक्शन प्रारंभ करने के लिए JSON पैरामीटर सूची का उपयोग करने का प्रयास कर रहा हूं। हालांकि, पैरामीटर में से एक एक फ़ंक्शन है, जिसे मैं स्ट्रिंग के रूप में संग्रहीत करता हूं, और जब मैं फ़ंक्शन को वापस करने के लिए eval() का उपयोग करने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है।

उदाहरण के लिए, अगर मेरे JSON है:

json = { "one": 700, "two": "function(e){alert(e);}" } 
मेरी कोड में

तब:

parameters = eval(json); 
$('myDiv').addThisFeature({ 
parameter_1: json.one, 
parameter_2: eval(json.two) // <= generates error 
}) 
+0

धन्यवाद - मुझे पता है कि JSON केवल डेटा है ... मैं jqGrid ऑब्जेक्ट को एक बदलती पैरामीटर सूची के साथ प्रारंभ करने का प्रयास कर रहा हूं, और कभी-कभी मैं एक पैरामीटर का उपयोग करता हूं, फ़ंक्शन लेता है ... और इस मामले में, फ़ंक्शन के रूप में स्वयं आंतरिक डेटा बदल रहा है, इसे उत्पन्न करना और इसे एक स्ट्रिंग के रूप में भेजना आसान है, फिर इसे मेरी लाइब्रेरी में परिभाषित करें और इसे अलग से प्रारंभ करें। –

उत्तर

7

उदाहरण:http://jsfiddle.net/patrick_dw/vs83H/

var json = '{ "one": 700, "two": "function(e){alert(e);}" }'; 
var parameters = JSON.parse(json); 
eval('var func = ' + parameters.two); 
func('test'); // alerts "test" 

आप ब्राउज़रों कि यह समर्थन नहीं करते JSON पुस्तकालय लोड करने के लिए की आवश्यकता होगी।

उदाहरण::http://jsfiddle.net/patrick_dw/vs83H/1/

var json = '{ "one": 700, "two": "function(e){alert(e);}" }'; 
eval('var parameters = ' + json); 
eval('var func = ' + parameters.two); 
func('test'); 

मुझे लगता है आप eval के खतरों के बारे में पता कर रहे हैं

या दो अलग-अलग evals है।

+0

धन्यवाद - बहुत अच्छा काम करता है। मुझे jquery के $() से जेसन वापस मिल जाता है। GetJSON(), जो इसे बिना eval के पारदर्शी बनाता है। –

+0

धन्यवाद - यह बहुत अच्छा काम करता है। मैंने अक्सर सुना है कि eval बुरा है - लेकिन मुझे वास्तव में क्यों नहीं पता क्यों। JSON.parse() और jquery's $ .parseJson() फ़ंक्शन का मूल्यांकन नहीं कर रहा है - ऐसा लगता है कि मुझे eval() का उपयोग करने की आवश्यकता है। हालांकि, अगर कोई इसका दुरुपयोग करना चाहता है, तो उन्हें विशिष्ट पैरामीटर जानना होगा, क्योंकि jquery $ .getJSON() कॉल से एक पार्स ऑब्जेक्ट देता है। –

+0

@Adam: यदि आप जानते हैं कि आपके द्वारा बेची जाने वाली सामग्री पर पूर्ण नियंत्रण है, तो आप ठीक हैं। यह सिर्फ यह है कि यह आपके द्वारा दिए गए जावास्क्रिप्ट के किसी भी स्ट्रिंग प्रस्तुति को निष्पादित करता है, इसलिए यदि कोई संभावना है कि कोई व्यक्ति कुछ दुर्भावनापूर्ण कोड पास कर सकता है, तो इसका उपयोग नहीं किया जाना चाहिए। – user113716

0

के लिए एक रास्ता eval का उपयोग नहीं यह सबसे अच्छा मैं के साथ आ सकता है के लिए खोज रहे । string से function बनाने के लिए फ़ंक्शन कन्स्ट्रक्टर का उपयोग करें।

var parsed = JSON.parse('{"one":"700", "two":"function(){return 0;}" }'); 
var func = new Function('return ' + parsed.two)(); // return parsed.two function 
alert(typeof func); // function 
alert(func()) // 0 
+0

मुझे लगता है कि आप टिप्पणी को हटाना चाहते हैं :) – Phrogz

+0

JSON ऑब्जेक्ट सभी ब्राउज़रों में मौजूद नहीं है। आईई 7 या इससे पहले नहीं है – mkoryak

0

this SO question देखें। जैसा कि कहा गया था, जेएसओएन डेटा रखने के लिए है। फ़ंक्शन के रूप में डेटा के एक टुकड़े का इलाज करने के लिए, आपको पहले स्ट्रिंग को eval करने की आवश्यकता होगी।

0

आप एक अज्ञात फ़ंक्शन eval'ing कर रहे हैं, जो निश्चित रूप से कुछ भी नहीं कहा जाएगा। यदि आप वास्तव में जेसन में कोड चलाने के लिए चाहते थे तो पाठ alert(e) होना चाहिए।

हालांकि यह करने के लिए एक बहुत समझदार चीज़ की तरह नहीं लगता है। जेसन में एम्बेडेड कोड चलाने की कोशिश करने के बजाए, जेसन ऑब्जेक्ट की सामग्री से निपटने के लिए आप कोड लिखना बेहतर होगा।

0

किसी भी तरह से विशेष रूप से अच्छा नहीं है, लेकिन यदि आप फ़ंक्शन (ई) रैपर बिट्स से छुटकारा पा सकते हैं, तो आप var myDynamicFunction = new Function("e", "alert(e);"); का उपयोग कर सकते हैं अन्यथा, आप eval() का उपयोग कर देख रहे हैं। Eval() सामान्य रूप से बुराई है। यदि यह JSON है कि आप $.getJSON कॉल या कुछ से वापस आ रहे हैं, तो आप सुरक्षा चिंताओं को स्वयं खोल रहे हैं।

1

इस का उपयोग करें:

parameters = eval('(' + json + ')'); 
$('#myDiv').addThisFeature({ 
parameter_1: parameters.one, 
parameter_2: eval('(' + parameters.two + ')') // <= does not generate an error 
}); 

शुरुआत और स्ट्रिंग के अंत में कोष्ठक जोड़ना सिंटेक्स त्रुटि रोकता है।

हालांकि, ध्यान दें कि आप eval का उपयोग कर (कुछ मामलों में सुरक्षा जोखिम है, लेकिन मुझे लगता है कि कोई वास्ता नहीं है क्योंकि आप सर्वर द्वारा भेजे गए मनमाने ढंग से कोड चलाना चाहते हैं जो) JSON को पार्स कर रहे हैं।यदि आपके पास सर्वर-साइड लचीलापन (अमान्य JSON भेजने के लिए) है, तो आप केवल स्ट्रिंग के रूप में उद्धृत फ़ंक्शन और eval को ठीक से पार्स करने में सक्षम होना चाहिए।

+0

धन्यवाद - बस इसे देखा ... यह फ़ंक्शन के लिए एक अलग चर परिभाषित करने से बहुत साफ है। –

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

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