2011-03-07 17 views
6

मैं है निम्नलिखित JSON स्ट्रिंग, पीएचपी साथ इनकोडिंग 5.2 json_encode() महत्व देता है। आप http://www.jsonlint.com/JSON.parse() नियमित अभिव्यक्ति के साथ समस्या यह

पर यह भी देख सकते हैं लेकिन देशी JSON.parse() विधि (Chrome, Firefox), निम्न त्रुटि फेंकता है, पार्स करने के दौरान:

SyntaxError: Unexpected token ILLEGAL 

करता है की आप जानते हैं, किसी को भी क्यों मैं नहीं कर सकता पार्स नियमित अभिव्यक्ति मेटा वर्ण से बच निकला?

इस उदाहरण काम करता है:

{"foo":"\\bar"} 

लेकिन इस एक भी विफल रहता है:

{"foo":"\\?"} 
BTW

: \. बस एक साधारण परीक्षण नियमित अभिव्यक्ति है, जो मैं जावास्क्रिप्ट के RegExp ऑब्जेक्ट के माध्यम से चलाने के लिए चाहते हैं।

अपने समर्थन के लिए धन्यवाद,

Dyvor

+3

यह ''{foo": "\\\\?"}' 'के लिए काम करता है। तो ऐसा लगता है कि आपको पात्रों से "दोबारा भागना" है। ''{" foo ":" \\ bar "}'' ** ** काम करने के लिए ** लगता है (यह कोई त्रुटि नहीं फेंकता है) लेकिन परिणाम '{foo:" ar "}' होगा। –

उत्तर

9

यह "काम नहीं कर रहा" है क्योंकि आप एक प्रमुख मुद्दा छूट रहा है: देखते हैं दो स्ट्रिंग को पार्स करता है जब आप Chrome कंसोल में टाइप की तरह एक लाइन पर जा रहा:

JSON.parse('{"foo": "\\."}'); 

पहले स्ट्रिंग पार्स तब होता है जब जावास्क्रिप्ट दुभाषिया स्ट्रिंग स्थिरता को पार करता है जिसे आप "पार्स()" विधि में भेज रहे हैं। दूसरा स्ट्रिंग पार्स जेएसओएन पार्सर के अंदर ही होता है। पहले पास के बाद, डबल बैकस्लैश सिर्फ एक बैकस्लैश है।

यह एक:

{"foo":"\\bar"} 

काम करता है क्योंकि "\ ख" मान्य इंट्रा-स्ट्रिंग एस्केप अनुक्रम है।

+0

+1 मैं कुछ इसी तरह लिखने जा रहा था ... –

+0

+1 पॉइंटी का अधिकार var test = {"foo": "\\ bar"}; अलर्ट (JSON.stringify (परीक्षण)); // अलर्ट '{"foo": "\\ bar"}'; var test2 = '{"foo": "\\ bar"}'; अलर्ट (JSON.stringify (JSON.parse (test2))); // अलर्ट '{"foo": "\ bar"}'; – DefyGravity

+1

@DefyGravity मुझे समझ में नहीं आता कि आप वहां क्या प्राप्त कर रहे हैं। -- ओह ठीक :-) – Pointy

0

, \\ की एक अतिरिक्त सेट जोड़ने क्यों काम करता है के रूप में मैं बिल्कुल यकीन नहीं है।

JSON.parse('{"foo":"\\\\."}'); 
+0

यह काम करता है क्योंकि दो पारियां हो रही हैं: फंक्शन कॉल अभिव्यक्ति में कोडिंग निरंतर स्ट्रिंग का जावास्क्रिप्ट पार्स, और उसके बाद परिणामी स्ट्रिंग का JSON पार्स। – Pointy

1

यह फ़ायरबग कंसोल में मेरे लिए काम करता है।

>>> JSON.parse('"\\\\."'); 
"\." 

जो सही है के रूप में JSON पार्सर वास्तव में "\\." प्राप्त करता है, अर्थात एक esacped बैकस्लैश और एक बिंदु।

क्या समस्या वास्तव में PHP से आने वाली प्रतिक्रिया के साथ आपको खुशी हुई? या बस एक "मैनुअल" परीक्षण में?

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