2010-06-30 33 views
11

चूंकि JSON प्रारूप निर्दिष्ट करता है कि सिंगल कोट्स से बच नहीं जाना चाहिए, इसलिए अधिकांश पुस्तकालय (या यहां तक ​​कि देशी JSON पार्सर) विफल हो जाएंगे यदि आपके पास एक से बच निकला है। अब यह आमतौर पर एक समस्या नहीं है क्योंकि अधिकांश समय आप एक एक्सएचआर करते हैं जो JSON के रूप में स्वरूपित कुछ डेटा प्राप्त करता है और आप प्रतिक्रिया टेस्ट का उपयोग करते हैं जिसमें आपकी JSON स्ट्रिंग है जिसे आप पार्स कर सकते हैं, आदिJSON शाब्दिक स्ट्रिंग का उपयोग कैसे करें?

इस विशेष स्थिति में, मेरे पास डेटाबेस में एक JSON स्ट्रिंग है जो टेक्स्ट के रूप में संग्रहीत है ... इसलिए डेटाबेस में {"property":"value"} जैसा कुछ है और मैं इसे सर्वर द्वारा बनाए गए HTML पृष्ठ के हिस्से के रूप में आउटपुट करना चाहता हूं ताकि उस पृष्ठ में जावास्क्रिप्ट कोड ऐसा कुछ दिखाई दे:

var x = '{"property":"value"}'; 
अब

यदि डेटाबेस में JSON स्ट्रिंग इस तरह एक भी बोली में शामिल हैं:

{"property":"val'ue"} 

तो मैं यह से बचने के लिए की जरूरत है वरना मैं एक स्ट्रिंग के रूप में उपयोग करने के लिए सक्षम नहीं होगा:

console.clear(); 
var obj = {prop:"val'ue"}; 
var str = JSON.stringify(obj); 
console.log("JSON string is %s",str); 
console.dir(JSON.parse(str)); //No problem here 


//This obviously can't work since the string is closed and it causes an invalid script 
//console.dir(JSON.parse('{prop:"val'ue"}')); 

//so I need to escape it to use a literal JSON string 
console.dir(JSON.parse('{"prop":"val\'ue"}')); 

सवाल तो क्यों {"prop":"val\'ue"} एक मान्य JSON स्ट्रिंग नहीं माना जाता है?

+0

तो, console.ir (JSON.parse ('{"prop": "val \' ue"} ') के साथ समस्या क्या है? यह मेरे लिए काम करता है (क्रोम) – mykhal

+0

ठीक है यह काम करता है, मेरा सवाल यह था कि यह क्यों अमान्य JSON {"prop": "value \ 'ue"} (विनिर्देशों द्वारा) माना जाता है जब एक ऐसी स्थिति में जहां मैं आपको बताता हूं यह आपकी स्ट्रिंग में है। यह अब मुझे पहले से ही एन्कोडेड JSON स्ट्रिंग को फिर से संसाधित करने के लिए मजबूर कर रहा है। – SBUJOLD

उत्तर

4

जावास्क्रिप्ट में - स्ट्रिंग '{"prop":"val\'ue"}'एक स्ट्रिंग शाब्दिक के रूप में JSON एन्कोड करने के लिए एक सही तरीका है।

चूंकि जावास्क्रिप्ट दुभाषिया एकल-उद्धृत स्ट्रिंग को पढ़ता है, तो यह \' को ' में परिवर्तित कर देगा। स्ट्रिंग के मान{"prop":"val'ue"} है जो वैध JSON है।

आदेश अमान्य JSON स्ट्रिंग बनाने के लिए, आप '{"prop":"val\\\'ue"}'

लिखने के लिए तो मैं समझता हूँ कि सवाल ठीक है, आप जावास्क्रिप्ट कोड है कि एक के डीकोड संस्करण के लिए कुछ चर सेट होगा उत्पन्न करने के लिए कोशिश कर रहे हैं के लिए होता है JSON स्ट्रिंग जो आपने डेटाबेस में संग्रहीत की है। तो अब आप स्ट्रिंग को दोबारा एन्कोड कर रहे हैं, क्योंकि इस स्ट्रिंग को जावास्क्रिप्ट में लाने का तरीका स्ट्रिंग शाब्दिक का उपयोग करना है, इसे JSON.parse() के माध्यम से पास करना है। आप जावास्क्रिप्ट स्ट्रिंग अक्षर के रूप में JSON स्ट्रिंग को एन्कोड करने के लिए सर्वर पक्ष JSON एन्कोडर का उपयोग करने पर भरोसा कर सकते हैं। उदाहरण के लिए:

<?php $jsonString = '{"prop":"val\'ue"}'; ?> 
var myJson = JSON.parse(<?php echo json_encode($jsonString) ?>); 
// Prints out: 
// var myJson = JSON.parse("{\"prop\":\"val'ue\"}"); 
// And results: Object - { prop: "val'ue"} 

हालांकि, अगर आप 100% यकीन है कि मान्य JSON होने जा रहा है, और अतिरिक्त पार्स/त्रुटि जाँच के वजन की जरूरत नहीं है कर रहे हैं - आपको लगता है कि सभी अतिरिक्त एन्कोडिंग छोड़ें और बस सकता है लिखें:

var myJson = <?php echo $jsonString; ?> 

याद रखें, जेएसओएन ऑब्जेक्ट को परिभाषित करने के लिए वैध जावास्क्रिप्ट वाक्यविन्यास है!

+1

Thx के "JSON तारों में वैध क्यों नहीं है" का जवाब देता है, मुझे निश्चित रूप से गलत सोच में आ गया है, जैसा कि आप कहते हैं, सबसे अच्छा निश्चित रूप से इसे फिर से एन्कोड करना है, इस तरह जावास्क्रिप्ट दुभाषिया 'व्याख्याित' स्ट्रिंग मान संग्रहीत करेगा, जिससे चर का मान वैध JSON स्ट्रिंग हो जाएगा। – SBUJOLD

+0

@ एसबीयूजॉल्ड - कोई समस्या नहीं :) खुश मैं आपको सही रास्ते पर वापस चला सकता हूं! – gnarf

+1

+1 अच्छा स्पष्टीकरण। – amelvin

2
jsonlint यह एकल उद्धरण से बचने के बिना वैध है के अनुसार

, तो यह ठीक है:

{"prop": "val'ue"} 

लेकिन यह अमान्य है:

:

{"prop":"val\'ue"} 

अनुसार json.org json के लिए

पूरी तरह से भाषा स्वतंत्र है लेकिन उन सम्मेलनों का उपयोग करता है जो fa भाषाओं के सी-परिवार की प्रोग्रामर, सी, सी ++, C#, जावा, जैसी miliar जावास्क्रिप्ट, पर्ल, पायथन, और कई दूसरों

तो यह सी-प्रकार भाषाओं में भाषा सम्मेलनों है रिवर्स ठोस (\) के संबंध में इसका मतलब है कि आपका उदाहरण मान्य नहीं है।

+0

+1 यह निश्चित रूप से – gnarf

1

आप निम्न कोशिश कर सकते हैं, हालांकि, यह बदसूरत है।

JSON.parse("{\"obj\":\"val'ue\"}");

या सिर्फ एक वर के लिए स्ट्रिंग पहली बार की दुकान। यह शाब्दिक बैकस्लैश मान को संग्रहीत नहीं करना चाहिए और इसलिए JSON पार्सर को काम करना चाहिए।


var str = '{"obj" : "val\'ue"}'; 
JSON.parse(str); 

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