2011-01-31 5 views
6

वहाँ है?किसी जेसन ऑब्जेक्ट के अंदर जावास्क्रिप्ट कोड निष्पादित करें?

इसलिए की तरह कुछ:

{ key1 : "val1", key2: "val2", some_code: "document.getElementById("someid").innerHTML='test';" } 

तो some_code किसी भी उपयोगकर्ता के हस्तक्षेप के बिना निष्पादित किया जाना चाहते हैं?

{ 
    "functionName": function() { 
    alert('Hello!'); 
    }() 
} 

हालांकि, कि नहीं मान्य JSON अब और होगा:

+0

नीचे जैसा, हाँ आप कर सकते हैं। हालांकि, यह सबसे अच्छा बचा है। यदि आप इसे किसी तृतीय पक्ष को प्रदान कर रहे हैं तो उसे अवरुद्ध होना चाहिए। –

उत्तर

2

ऐसा नहीं है कि, हाँ, ऐसा करके उदाहरण के लिए ऐसा करना संभव है। JSON फ़ंक्शन स्वीकार नहीं करता है।

+0

हम्म - एक बैकएंड सर्वर से ग्राहक ब्राउज़र में उस संरचना को बनाने और पास करने में थोड़ा मुश्किल है? –

3

यह अब JSON नहीं होगा। लेकिन आप पोस्ट-प्रक्रिया कर सकते हैं पार्स JSON:

json.some_code = eval(json.some_code); 

हालांकि इस खतरनाक हो सकता है (स्क्रिप्ट इंजेक्शन, आदि)।

इसलिए, यदि आप, इस के बजाय कर सकते हैं:

json = { key1 : "val1", key2: "val2", elem: "someid", html:"test" }; 
document.getElementById(json.elem).innerHTML=json.html; 
0

ठीक है, पहले आप डबल उद्धरण से बचने के लिए की जरूरत है: (। या का उपयोग एकल उद्धरण)

{ key1 : "val1", key2: "val2", some_code: "document.getElementById(\"someid\").innerHTML='test';" } 

यदि आप some_code फ़ील्ड को स्क्रिप्ट के रूप में मूल्यांकन करना चाहते हैं, तो इसे निष्क्रिय करने के लिए इसे पास करना उतना आसान है:

eval(obj.some_code); 

यह निश्चित रूप से बहुत खतरनाक है जब तक कि आपके पास some_code की सामग्री पर पूर्ण नियंत्रण न हो।

2

सं।

सबसे पहले, आपका उदाहरण वैध JSON मान्य नहीं है। इसे JSON validator पर आज़माएं।

दूसरा, जेएसओएन एक डाटा एक्सचेंज मानक है और जब सही ढंग से पार्स किया जाता है, तो उसके अंदर कोई भी पाठ जो कुछ कोड है, निष्पादित नहीं किया जाएगा।

JSON security issues पर पढ़ें।

अंगूठे का नियम: जावास्क्रिप्ट eval फ़ंक्शन का उपयोग न करें, बल्कि डगलस क्रॉकफ़ोर्ड के JSON evaluator जैसे तैयार किए गए पार्सर का उपयोग न करें।

+0

ठीक है धन्यवाद दोस्तों - मुझे लगता है कि आईडी प्रोबली उस पर चिपक जाती है - जेसन डेटा के रूप में और एक जेसन ऑब्जेक्ट "स्वयं निष्पादित" करने का कोई संभावित तरीका नहीं है। –

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

  • कोई संबंधित समस्या नहीं^_^