2009-06-04 20 views
42

बचने पर भी एक डबल कोट पार्स त्रुटि फेंक रहा है।डबल कोट्स के साथ जेसन पार्स त्रुटि

//parse the json in javascript 
var testJson = '{"result": ["lunch", "\"Show\""] }'; 
var tags = JSON.parse(testJson); 
alert (tags.result[1]); 

नीचे कोड पर
देखो इसका कारण यह है दोहरे उद्धरण चिह्नों (जो पहले से ही फरार हो जाता है) की पार्स त्रुटि फेंक रहा है।
यहां तक ​​कि eval() यहां काम नहीं करेगा।
लेकिन अगर मैं इस तरह डबल स्लैश के साथ यह बच:

var result = '{"result": ["lunch", "\\"Show\\""] }'; 
var tags = JSON.parse(result); 
alert (tags.result[1]); 

तो यह ठीक काम करता है।
हमें जावास्क्रिप्ट में डबल स्लैश का उपयोग करने की आवश्यकता क्यों है? समस्या यह है कि PHP json_encode() फ़ंक्शन एक स्लैश के साथ एक डबल कोट से बच निकलता है (जैसे: \"show\") जो JSON.parse पार्स करने में सक्षम नहीं होगा। मैं इस स्थिति को कैसे संभाल सकता हूं?

+1

वर eval ('(' + परिणाम + ')'); – Priya

उत्तर

29

ठीक है, आखिरकार, जेएसओएन का पार्स एक ही eval का उपयोग करता है, इसलिए जब आप उन्हें smth देते हैं तो कोई फर्क नहीं पड़ता। गलत वाक्यविन्यास के साथ। इस मामले में आप php में सही ढंग से अपने उद्धरण से बचने, और फिर उन्हें बचने के लिए है और उनके एस्केपिंग json_encode

<?php 
    $json = '{"result": ["lunch", "\"Show\""] }'; 
    echo json_encode($json); 
?> 

OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }" 

इस पर क्लाइंट साइड जे एस काम करना चाहिए (अगर मैं टाइप की कोई गलती कर दिया है) के साथ स्लैश।

+1

से शुरू होने वाला डिफ़ॉल्ट व्यवहार होना चाहिए था लेकिन यह ऐसा कुछ है जिसे json_encode() फ़ंक्शन का ख्याल रखा जाना चाहिए। यह ऐसा कुछ क्यों लौटा रहा है जिसे JSON.parse() द्वारा सही ढंग से पार्स नहीं किया जा सकता है। – Varun

+0

क्या इसका मतलब है php_encode() छोटी है .. ?? – Varun

+7

यह json_encode में एक बग नहीं है (मुझे लगता है कि आप यही मतलब है)। json_encode का उद्देश्य जावास्क्रिप्ट स्ट्रिंग अक्षर बनाने का इरादा नहीं है, इसलिए यह अतिरिक्त भागने से नहीं करता है। –

33

जावास्क्रिप्ट अपने तारों से बाहर निकलता है और जेसन भी उन्हें अनदेखा करता है। पहली स्ट्रिंग ('{"result": ["lunch", "\"Show\""] }') जेसन पार्सर द्वारा {"result": ["lunch", ""Show""] } के रूप में देखी जाती है, क्योंकि \" जावास्क्रिप्ट में " है, लेकिन डबल उद्धृत स्ट्रिंग से बाहर नहीं निकलता है।

दूसरी स्ट्रिंग '{"result": ["lunch", "\\\"Show\\\""] }' पहले {"result": ["lunch", "\"Show\""] } (और यह सही ढंग से जेसन द्वारा अनचाहे है) से अनचेक हो जाता है।

मुझे लगता है कि '{"result": ["lunch", "\\"Show\\""] }' भी काम करना चाहिए।

+5

+1 यह वास्तव में सही उत्तर है – Christian

8

docs

JSON_HEX_APOS (पूर्णांक) सभी को \ u0027
JSON_HEX_QUOT (पूर्णांक) सभी "\ u0022

json_encode में बदल रही हैं बदल रहे हैं '() दो आर्ग लेता है, मूल्य और विकल्प। तो

json_encode($result, JSON_HEX_QUOT); // or 
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS); 

मेरे पास नहीं है हालांकि यह ried।

+1

चेतावनी: json_encode() वास्तव में 1 पैरामीटर की अपेक्षा करता है, 2 में दिया गया है ... –

+1

आप दस्तावेज़ों के संकेत के अनुसार 5.3.0 से पुराने PHP का संस्करण उपयोग कर रहे हैं। – raylu

+0

यह उत्तर है, लेकिन यह – nus

10

यह समस्या दो गुना स्ट्रिंग से बचने वाली तंत्र के कारण होती है: कोई जेएस से आता है और एक JSON से आता है।

बैकस्लैश चरित्र का एक संयोजन निम्नलिखित वर्ण के साथ संयुक्त एक वर्ण का प्रतिनिधित्व करने के लिए किया जाता है जो स्ट्रिंग के भीतर अन्यथा प्रतिनिधित्व योग्य नहीं है। '' \\ '' के लिए खड़ा है '\' आदि

यह बचने वाला तंत्र JSON.parse() कार्यों से पहले होता है।

उदाहरण के लिए,

var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}'); 
console.log(parsedObj.sentence); 
>>>"It is one backslash(\)" 

स्ट्रिंग जनरेटर के दृष्टिकोण से, यह चार backlashes '\' जावास्क्रिप्ट interpretor में गुजरता है।

जावास्क्रिप्ट व्याख्याकर्ता के परिप्रेक्ष्य से, यह से छेड़छाड़ करता है, दो बैकलैश (\) हैं क्योंकि प्रत्येक '\\' अनुक्रम को एक '\' के रूप में व्याख्या किया जाएगा।

JSON पार्सर के दृष्टिकोण से, यह दो backlashes (\\) और JSON स्ट्रिंग से बच नियम यह एक ही '\' जो उत्पादन परिणाम है के रूप में पार्स जाएगा प्राप्त करता है।

आप पहली बार कोड के बारे में बताएं:

var testJson = '{"result": ["lunch", "\"Show\""] }'; 
//The real string after sequence escaping in to JS is 
//'{"result": ["lunch", ""Show""] }' 
//which is passed into the JSON.parse. 
//Thus, it breaks the JSON grammar and generates an error 
var tags = JSON.parse(testJson); 
alert (tags.result[1]); 
+2

+1 – Izkata

1

जावास्क्रिप्ट वस्तु के लिए php (php> = 5.3.0)

var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>'); 
संबंधित मुद्दे