2010-08-13 13 views
25

मैं जावास्क्रिप्ट में स्ट्रिंग के नीचे स्ट्रिंग को कन्वर्ट करना चाहता हूं।जावास्क्रिप्ट में ऑब्जेक्ट की सरणी में स्ट्रिंग को कन्वर्ट करने का सबसे अच्छा तरीका?

{a:12, b:c, foo:bar} 

मैं इस स्ट्रिंग को ऑब्जेक्ट्स की सरणी में कैसे परिवर्तित करूं? कोई अच्छा विचार?

+2

यह सरणी कैसा दिखाई देगी? –

+1

जो JSON की तरह दिखता है। यह पहले से ही एक सहयोगी सरणी की तरह है और इस तरह से पहुंचा जा सकता है। क्या आप इससे जागरुक हैं? [यहां देखें] (http://www.hunlock.com/blogs/Mastering_JSON_ (_JavaScript_Object_Notation_% 29) – BalusC

+0

यह एक सरणी नहीं है। यह एक स्ट्रिंग है। मुझे यह टैग स्ट्रिंग से यह स्ट्रिंग मिलती है। और मैं इसे कन्वर्ट करना चाहता हूं एक सरणी के लिए स्ट्रिंग। – Zeck

उत्तर

74

मुझे लगता है कि यह कर, Douglas Crockford के रूप में का सबसे अच्छा तरीका (जावास्क्रिप्ट की biggests गुरुओं में से एक) suggests in here, JSON native parser का उपयोग कर के रूप में यह eval (से न केवल तेजी से होता है है), यह भी अधिक सुरक्षित है।

मूल निवासी JSON पार्सर में पहले से ही उपलब्ध है:

  • Firefox 3.5+
  • आईई 8
  • ओपेरा 10.5+
  • सफारी सफारी 4.0.3+
  • क्रोम (नहीं है पता है कि कौन सा संस्करण)

और क्रॉकफ़ोर्ड ने जावास्क्रिप्ट में सुरक्षित फ़ॉलबैक किया है टी, जिसे json2.js कहा जाता है, जो कुछ सुरक्षा बिट्स के साथ और मूल JSON पार्सर्स एपीआई के साथ eval() दृष्टिकोण का अनुकूलन है। आपको बस उस फ़ाइल को शामिल करने की आवश्यकता है, अपनी पहली पंक्ति हटा दें, और मूल JSON पार्सर का उपयोग करें, और यदि यह मौजूद नहीं है तो json2 काम करेगा।

यहाँ एक उदाहरण है:

var myJSONString = '{ "a": 1, "b": 2 }', 
    myObject = JSON.parse(myJSONString); 

एक बार पार्स आप विशेषताओं a और b के साथ एक वस्तु मिल जाएगा, और जैसा कि आप जानते हैं, आप एक हैश तालिका या associative array जावास्क्रिप्ट में के रूप में एक वस्तु का इलाज कर सकते हैं, तो आप इस तरह के मूल्यों उपयोग करने में सक्षम होगा:

+०१२३५१६४१०:

myObject['a']; 

आप सिर्फ एक सरल सरणी और एक साहचर्य एक आप की तरह कुछ कर सकता है नहीं करना चाहते हैं

var myArray = []; 
for(var i in myObject) { 
    myArray.push(myObject[i]); 
} 

आखिरकार, हालांकि सादे जावास्क्रिप्ट में आवश्यक नहीं है, JSON spec सदस्यों की कुंजी को उद्धृत करने की आवश्यकता है। तो नेविट पार्सर इसके बिना काम नहीं करेगा। अगर मैं आप थे तो मैं इसे जोड़ूंगा, लेकिन यदि यह संभव नहीं है तो var myObject = eval("(" + myString + ")"); दृष्टिकोण का उपयोग करें।

+0

var myObject = e क्या करता है वैल ("(" + myString + ")"); क्या मतलब है? बहुत बहुत धन्यवाद। – MEM

+1

eval() जावास्क्रिप्ट स्रोत के रूप में एक स्ट्रिंग को पार करता है, और चूंकि सभी मान्य JSON भी वैध जावास्क्रिप्ट (और यह जावास्क्रिप्ट ऑब्जेक्ट नोटेशन से आता है) है, तो आप इसे जावास्क्रिप्ट प्रतिनिधित्व में बदलने के लिए eval() का उपयोग कर सकते हैं। सुरक्षा कारणों से स्ट्रिंग की शुरुआत और अंत में माता-पिता को जोड़ने का एक आम प्रथा है, हालांकि eval() अभी भी बहुत असुरक्षित उपयोग कर रहा है। तो, var myObject = eval ("(" + myString + ")"); बस MyString JSON को पार्स कर रहा है और myObject चर (शायद एक ऑब्जेक्ट या सरणी) में इसका मान प्राप्त कर रहा है – alcuadrado

+0

ध्यान दें कि json2 अभी भी eval का उपयोग करता है, लेकिन संभावित भेद्यता –

7

यह करने के लिए सबसे आसान है, लेकिन सुरक्षित तरीका नहीं है:

eval('(' + myJSONtext + ')') 

लेकिन चूंकि यह किसी भी जावास्क्रिप्ट कोड की व्याख्या करेगा, यह सुरक्षा छिद्र है। इस प्रयोग के खिलाफ एक जेसन पार्सर का उपयोग करने के लिए। यदि आप एक ढांचे का उपयोग कर रहे हैं (jquery, mootools, आदि) वहाँ एक ढांचा-विशिष्ट कॉल है। उनमें से अधिकांश डगलस क्रॉफर्ड के पार्सर पर आधारित हैं http://www.json.org/js.html पर उपलब्ध हैं।

2

आप

var myObject = {a:'12', b:'c', foo:'bar'}; 
var myArray = []; 

for(key in myObject) { 
    var value = myObject[key]; 
    myArray[key] = value; 
} 

myArray['a']; // returns 12 

नोट्स "के लिए" का उपयोग कर सकते हैं: यह देखते हुए कि myObject केवल कुंजी-मान जोड़ों में से एक स्तर है।

+0

यदि आप वास्तव में एक स्ट्रिंग का उपयोग करना चाहते हैं, तो पहले पंक्ति को var myObject = eval ('(' + "{a: '12 ', b:' c ', foo:' bar '}" +') ') में बदलें। ; @Rob टिप का उपयोग कर – Topera

+0

हाँ, धन्यवाद। – Zeck

1

यदि आप jQuery का उपयोग कर रहे हैं, तो $.parseJSON() फ़ंक्शन है।स्ट्रिंग खराब होने पर यह अपवाद फेंकता है, और "इसके अतिरिक्त यदि आप कुछ भी नहीं पास करते हैं, तो खाली स्ट्रिंग, शून्य, या अपरिभाषित, 'शून्य' parseJSON से वापस कर दिया जाएगा। जहां ब्राउज़र JSON.parse, jQuery का मूल कार्यान्वयन प्रदान करता है स्ट्रिंग को पार्स करने के लिए इसका उपयोग करता है "

7

चूंकि आपकी स्ट्रिंग खराब है JSON, एक JSON पार्सर इसे ठीक से पार्स नहीं कर सकता है और यहां तक ​​कि eval() भी एक त्रुटि फेंक देगा। यह एक ऐरे भी नहीं है बल्कि हैश मैप या बस एक ऑब्जेक्ट शाब्दिक (विकृत) है। यदि ऑब्जेक्ट शाब्दिक में केवल संख्या और स्ट्रिंग मान होंगे (और कोई बच्चा ऑब्जेक्ट/सरणी नहीं) तो आप निम्न कोड का उपयोग कर सकते हैं।

function malformedJSON2Array (tar) { 
    var arr = []; 
    tar = tar.replace(/^\{|\}$/g,'').split(','); 
    for(var i=0,cur,pair;cur=tar[i];i++){ 
     arr[i] = {}; 
     pair = cur.split(':'); 
     arr[i][pair[0]] = /^\d*$/.test(pair[1]) ? +pair[1] : pair[1]; 
    } 
    return arr; 
} 

malformedJSON2Array("{a:12, b:c, foo:bar}"); 
// result -> [{a:12},{b:'c'},{foo:'bar'}] 

वह कोड आपकी स्ट्रिंग को ऑब्जेक्ट्स (बहुवचन) के ऐरे में बदल देगा।

यदि फिर भी आप वास्तव में एक HashMap (साहचर्य सरणी) और नहीं एक सरणी चाहता था, निम्नलिखित कोड का उपयोग करें: जब आप नेस्टिंग वस्तुओं और सरणियों शुरू

function malformedJSON2Object(tar) { 
    var obj = {}; 
    tar = tar.replace(/^\{|\}$/g,'').split(','); 
    for(var i=0,cur,pair;cur=tar[i];i++){ 
     pair = cur.split(':'); 
     obj[pair[0]] = /^\d*$/.test(pair[1]) ? +pair[1] : pair[1]; 
    } 
    return obj; 
} 

malformedJSON2Object("{a:12, b:c, foo:bar}"); 
// result -> {a:12,b:'c',foo:'bar'} 

ऊपर कोड एक बहुत अधिक जटिल हो जाएगा। मूल रूप से आपको विकृत JSON का समर्थन करने के लिए JSON.js और JSON2.js को फिर से लिखना होगा।

यह भी निम्न विकल्प पर विचार करें, जो अभी भी खराब है, मैं स्वीकार करता हूं, लेकिन एचटीएमएल टैग की विशेषता के अंदर JSON चिपकाने के बाद मामूली बेहतर है।

<div id="DATA001">bla</div> 
<!-- namespacing your data is even better! --> 
<script>var DATA001 = {a:12,b:"c",foo:"bar"};</script> 

मैं तुम्हें संभालने हूँ स्ट्रिंग में उद्धरण चिह्न छोड़ देते हैं क्योंकि आप इसे एक HTML टैग की विशेषता के अंदर रखा था और उद्धरण से बचने के लिए नहीं चाहता था।

+0

+1 को कम करने के लिए कुछ जांच करता है यह देखते हुए कि स्ट्रिंग उचित JSON नहीं है –

0

JSON.parse चाल करेगा। एक बार पार्स हो जाने पर, आप उन्हें सरणी में धक्का दे सकते हैं।

var object = JSON.parse(param); 
var array = []; 
for(var i in object) { 
    array.push(object[i]); 
}