JSON में दोहरे उद्धरण चिह्नों से कैसे बचें


306

मैं दोहरे उद्धरण दिखाने की कोशिश कर रहा हूं, लेकिन यह बैकस्लैश में से एक दिखाता है:

"maingame": {
    "day1": {
        "text1": "Tag 1",
        "text2": "Heute startet unsere Rundreise \\\"Example text\\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
    }
}

Html में रेंडर करते समय यह दिखाता है \"Example text\"। सही तरीका क्या है?

जवाबों:


446

इसे इस्तेमाल करे:

"maingame": {
  "day1": {
    "text1": "Tag 1",
     "text2": "Heute startet unsere Rundreise \" Example text\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
  }
}

(सिर्फ एक बैकस्लैश ( \) उद्धरण के सामने)।


9
@DWGuru इस टिप्पणी के साथ कोई संबंध नहीं है, यह एक एस्केप अनुक्रम में वर्णित के रूप में है ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf (। सममूल्य 9 - स्ट्रिंग्स) जहां यह कहते हैं: All characters may be placed within the quotation marks except for the characters that must be escapedऔर फिर इसे निर्दिष्ट करता है:\" represents the quotation mark character (U+0022)
मास्टाज़ी

किसी कारण से, यह जेएसएन में JSON.parse () के साथ काम नहीं करता है।
SacWebDeveloper

32

इसकी जगह कब और कहां इस्तेमाल \\\"करना है। ठीक है अगर आप मेरे जैसे हैं तो आपको उतना ही मूर्खतापूर्ण महसूस होगा जितना मैंने तब किया जब मुझे एहसास हुआ कि इस धागे को पाकर मैं क्या कर रहा था।

यदि आप एक .json पाठ फ़ाइल / धारा बनाने और डेटा से वहाँ तो दोहरे उद्धरण चिह्नों से पहले सिर्फ एक बैकस्लैश की मुख्य धारा जवाब आयात कर रहे हैं: \"एक के लिए आप देख रहे हैं।

हालाँकि, यदि आप मेरे जैसे हैं और आप j3.choolse.com "ट्रायिट एडिटर" को पाने की कोशिश कर रहे हैं, तो JSON.parse (टेक्स्ट) के आउटपुट में एक डबल कोट्स है, तो आप जिसे खोज रहे हैं वह ट्रिपल है बैकस्लैश डबल कोट्स \\\"। ऐसा इसलिए है क्योंकि आप अपने टेक्स्ट स्ट्रिंग को HTML <script>ब्लॉक में बना रहे हैं, और पहला डबल बैकस्लैश स्ट्रिंग वेरिएबल में एक सिंगल बैकस्लैश सम्मिलित करता है, फिर निम्न बैकस्लैश डबल कोट स्ट्रिंग में डबल कोट सम्मिलित करता है ताकि परिणामी स्क्रिप्ट स्ट्रिंग में \"से: मानक उत्तर और JSON पार्सर सिर्फ दोहरे उद्धरण चिह्नों के रूप में पार्स करेगा।

<script>
  var text="{";
  text += '"quip":"\\\"If nobody is listening, then you\'re likely talking to the wrong audience.\\\""';
  text += "}";
  var obj=JSON.parse(text);
</script>

+1: चूंकि यह एक जावास्क्रिप्ट पाठ स्ट्रिंग है, इसलिए एक डबल बैकस्लैश डबल उद्धरण \\"भी काम करेगा; क्योंकि दोहरे उद्धरण-चिह्न की आवश्यकता नहीं है, इसलिए एक ही उद्धृत स्ट्रिंग जैसे '\"'और '"'जेएस स्ट्रिंग में परिणाम।


यह समाधान एक स्विफ्ट संस्करण को एक स्ट्रिंग बनाने में मदद करता है जो JSON POST के तर्कों में जोड़ा जाता है।
निक एन

18

यह बैकस्लैश दिखा रहा है क्योंकि आप बैकस्लैश से भी बच रहे हैं।

यदि आप अपने JSON उद्धृत स्ट्रिंग में एक को शामिल करना चाहते हैं, तो दोहरे उद्धरण चिह्नों के अलावा, आपको बैकस्लैश से भी बचना चाहिए। हालाँकि यदि आप एक भागने के क्रम में एक बैकस्लैश का उपयोग करने का इरादा रखते हैं, तो जाहिर है कि आपको इससे बचना नहीं चाहिए।


9

ध्यान दें कि यह अक्सर तब होता है जब सामग्री "डबल एन्कोडेड" हो गई है, जिसका अर्थ है कि एन्कोडिंग एल्गोरिथ्म को गलती से दो बार कहा गया है।

पहला कॉल "text2" मान को एन्कोड करेगा:

FROM: Heute startet Rundreise "उदाहरण पाठ" को अनसुना कर देता है। जेडेन टैग विर्ड ईन न्यूस रीसेज़िएल एगेस्तुएर्ट बिस वाइर।

To : Heute startet Rerereise Rundreise \ "उदाहरण text \" को अनसुना करें। जेडेन टैग विर्ड ईन न्यूस रीसेज़िएल एगेस्तुएर्ट बिस वाइर।

एक दूसरा एन्कोडिंग तब इसे फिर से रूपांतरित करता है, पहले से ही बच गए पात्रों से बचकर:

FROM: Heute startet Rundreise \ "उदाहरण टेक्स्ट \" को अनसेंड कर देते हैं। जेडेन टैग विर्ड ईन न्यूस रीसेज़िएल एगेस्तुएर्ट बिस वाइर।

To : Heute startet Rundreise \\\ "उदाहरण के लिए टेक्स्ट \\\" की शुरुआत करें। जेडेन टैग विर्ड ईन न्यूस रीसेज़िएल एगेस्तुएर्ट बिस वाइर।

इसलिए, यदि आप यहां सर्वर के कार्यान्वयन के लिए जिम्मेदार हैं, तो सुनिश्चित करें कि एक ही सामग्री को एन्कोड करने के लिए दो चरण नहीं हैं।


6
मेरा मानना ​​है कि एनकोडर भी एस्केप स्विच से बच जाएगा, इसलिए मुझे लगता है कि आपका दूसरा TO: पढ़ना चाहिए: "Heute startet unsere Rundreise \\\" उदाहरण text \\\ "। Jeden Tag wird ein neues Reiseziel angesteuert bis wir।
जोनाथन मी।

1
@ जोनाथन मी: बस अपने सुझाव के अनुसार उत्तर संपादित करें। यह सैद्धांतिक रूप से 3 बैकस्लैश के साथ सही ढंग से लिखा गया था, लेकिन
स्टैकओवरफ़्लो

5

यदि आप JSON में डबल कोट से बचना चाहते हैं तो इसे बचने के लिए \\ का उपयोग करें।

उदाहरण यदि आप जावास्क्रिप्ट वस्तु के json बनाना चाहते हैं

{time: '7 "o" clock'}

तो आपको निम्नलिखित तरीके से लिखना होगा

'{"time":"7 \\"o\\" clock"}'

अगर हम इसका इस्तेमाल करते हैं JSON.parse()

JSON.parse('{"time":"7 \\"o\\" clock"}')

परिणाम होगा

{time: "7 "o" clock"}

1

JSON डेटा के लिए समस्याओं का कारण बनने वाले बैकस्लैश से बचने के लिए मैं इस फ़ंक्शन का उपयोग करता हूं।

//escape backslash to avoid errors
var escapeJSON = function(str) {
    return str.replace(/\\/g,'\\');
};

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

ठीक है, मैंने जनता को खुश करने के लिए चरित्र अलग करने वाले हिस्से को हटा दिया। @DanBaker ध्यान रखें कि किसी ग्राहक ऐप में JS को सुरक्षित बनाने का एकमात्र तरीका वर्णों का पाठ हो सकता है। कोणीय डिफ़ॉल्ट रूप से इस कारण से HTML आउटपुट को साफ करता है।
mbokil

मैं मानता हूं कि 100% बार ऐसा होता है कि डेटा को सैनिटाइज़ करना पड़ता है ... और XSS उन समयों में से एक है। उस एक को इंगित करने के लिए धन्यवाद।
दानबकर

0

उन लोगों के लिए जो डेवलपर शक्तियों का उपयोग करना चाहते हैं। यहां आपकी सेटिंग में जोड़ने के लिए लाइनें हैं। Json:

"terminal.integrated.automationShell.windows": "C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
"terminal.integrated.shellArgs.windows": [
    "-noe",
    "-c",
    " &{Import-Module 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll'; Enter-VsDevShell b7c50c8d} ",
    ],
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.