मैं एक एपीआई से प्राप्त JSON स्ट्रिंग को पार्स करने का प्रयास कर रहा हूं:

var inputString = '{ "AccountName": "NT AUTHORITY\\SYSTEM"}'
console.log(JSON.parse(inputString)) // View in browser console to see real error

उपरोक्त कोड त्रुटि देता है:

ध्यान में न आया सिंटैक्स त्रुटि: JSON में अनपेक्षित टोकन एस स्थिति 31 पर JSON.parse () program.html:7 पर

अब नीचे कोड काम करता है:

var inputString = '{ "AccountName": "NT AUTHORITY\\\\SYSTEM"}'
console.log(JSON.parse(inputString))

यह आउटपुट दिखाता है:

{AccountName: "NT AUTHORITY\SYSTEM"}

बैकस्लैश कैरेक्टर JSON में एक एस्केप सीक्वेंस है। लेकिन मुझे सिंगल बैकस्लैश बनाने के लिए चार बैकस्लैश की आवश्यकता क्यों है? क्या यह केवल \\ नहीं होना चाहिए?

JSON प्रतिक्रिया जो मुझे API से मिल रही है, मुझे केवल दो \\ दे रही है जहाँ कभी भी कोई रास्ता हो। तो मेरा कोड टूट रहा है। मेरा मानना ​​है कि एपीआई का JSON प्रारूप सही है। जब मैं इस प्रतिक्रिया को ऑनलाइन JSON व्यूअर पर पार्स करने का प्रयास करता हूं तो वे इसे सफलतापूर्वक पार्स करने में सक्षम होते हैं।

3
RBT 15 सितंबर 2018, 11:41

2 जवाब

सबसे बढ़िया उत्तर

सबसे पहले, टेम्पलेट शाब्दिक पार्स किया गया है। सामान्य स्ट्रिंग्स की तरह, डबल बैकस्लैश का अनुवाद एकल शाब्दिक बैकस्लैश में किया जाता है। तो, आपका प्रारंभिक inputString:

var inputString = `{ "AccountName": "NT AUTHORITY\\SYSTEM"}`

इसमें एक एकल बैकस्लैश होगा।

console.log(`\\`.length);

सादे जावास्क्रिप्ट स्ट्रिंग्स के विपरीत (जिसमें अनावश्यक बैकस्लैश को केवल अनदेखा किया जाता है), JSON प्रारूप आवश्यकता जो बैकस्लैश से बचने के लिए एक विशेष वर्ण से पहले होता है (जैसे " या कोई अन्य \)। यदि कोई बैकस्लैश और निम्न वर्ण नहीं एस्केप वर्ण में अनुवाद करते हैं, तो आपके प्रश्न में दिखाई देने वाला SyntaxError जैसा होगा।

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

यदि आप मैन्युअल रूप से स्ट्रिंग लिखना चाहते हैं जिसमें शाब्दिक बैकस्लैश शामिल हैं, और आपको एस्केप वर्णों का उपयोग करने की आवश्यकता नहीं है, तो आप अपने टेम्प्लेट लिटरल्स के लिए String.raw का उपयोग करने पर विचार कर सकते हैं, जो सिंगल बैकस्लैश को < के रूप में पार्स करते हैं। em>शाब्दिक बैकस्लैश एक भागने के क्रम के भाग के बजाय:

console.log(
  String.raw`\\`.length
);
const inputString = String.raw`{ "AccountName": "NT AUTHORITY\\SYSTEM"}`;
console.log(JSON.parse(inputString))
3
CertainPerformance 15 सितंबर 2018, 11:57

आपके पास टेम्पलेट स्ट्रिंग के अंदर स्ट्रिंग है। एक बैकस्लैश का उपयोग टेम्प्लेट स्ट्रिंग द्वारा किया जाता है और दूसरा उद्धृत टेक्स्ट के लिए होता है

0
marzelin 15 सितंबर 2018, 11:47