JSON स्ट्रिंग के निर्माण में विशेष पात्रों से कैसे बचें?


200

यहाँ मेरा तार है

{
    'user': {
        'name': 'abc',
        'fx': {
            'message': {
                'color': 'red'
            },
            'user': {
                'color': 'blue'
            }
        }
    },
    'timestamp': '2013-10-04T08: 10: 41+0100',
    'message': 'I'mABC..',
    'nanotime': '19993363098581330'
}    

यहां संदेश में एकल उद्धरण चिह्न है, जो JSON में उपयोग किए गए उद्धरण के समान है। मैं जो भी करता हूं वह उपयोगकर्ता इनपुट जैसे संदेश से एक स्ट्रिंग को भरता है। इसलिए, मुझे उन विशेष परिदृश्यों से बचने की जरूरत है जो कोड को तोड़ते हैं। लेकिन स्ट्रिंग रिप्लेस के अलावा, क्या उनके बचने का कोई तरीका है लेकिन फिर भी HTML उन्हें सही संदेश वापस भेजने की अनुमति देता है?


45
JSON केवल दोहरे उद्धरण चिह्नों का उपयोग करता है, एकल उद्धरण नहीं, json.org
Niels Bom

4
RFC 4627 बताता है कि पार्सर्स JSON (पैराग्राफ 4) के अनुरूप होने में सक्षम हो सकते हैं, और अतिरिक्त गैर-JSON एक्सटेंशन का समर्थन कर सकते हैं। हालाँकि, पैराग्राफ 5 सशक्त रूप से बताता है कि सभी निर्माता (जनरेटर) केवल 100% संगत JSON का उत्पादन करते हैं। JSON को फ्रेम वर्णों के साथ निर्मित करना, जिन्हें भागने की आवश्यकता नहीं है, विशेष रूप से बुरा विचार है। कृपया उद्धरण चिह्नों के साथ अपने प्रेरितों को बदलने पर विचार करें। ietf.org/rfc/rfc4627.txt
Luv2code

3
@ Luv2code आपके द्वारा बनाये जा रहे बिंदु सही रहते हैं, ध्यान दें कि आप एक अप्रचलित युक्ति का हवाला दे रहे हैं। RFC पढ़ते समय, हमेशा tools.ietf.org/html संस्करण का उपयोग करें , न कि पाठ संस्करण का। HTML संस्करणों को पढ़ना आसान है और सब-इन के उप-लिंक से लिंक करना और सबसे महत्वपूर्ण बात यह है कि HTML संस्करणों के शीर्ष पर, बाद के सभी RFC की एक सूची है जो आपके द्वारा पढ़े जाने वाले को अद्यतन या अप्रचलित करती है। यदि आप tools.ietf.org/html/rfc4627 पर गए हैं तो आपने देखा होगा कि RFC 4627 अप्रचलित है और इसे RFC 7159 से बदल दिया गया है ।
मार्क अमेरी जूल

3
भविष्य में इसे पढ़ने वाले लोगों के लिए, RFC 7159 को बदले में tools.ietf.org/html/rfc8259
van den Boezem

जवाबों:


286

JSON स्ट्रिंग को स्पेक्स के अनुसार डबल-कोटेड होना चाहिए , ताकि आपको भागने की आवश्यकता न हो '
यदि आपको अपने JSON स्ट्रिंग में विशेष वर्ण का उपयोग करना है, तो आप \वर्ण का उपयोग करके इससे बच सकते हैं ।

JSON में प्रयुक्त विशेष चरित्र की इस सूची को देखें:

\b  Backspace (ascii code 08)
\f  Form feed (ascii code 0C)
\n  New line
\r  Carriage return
\t  Tab
\"  Double quote
\\  Backslash character


हालाँकि, भले ही यह पूरी तरह से कल्पना के विपरीत हो, लेखक उपयोग कर सकता है \'

यह बुरा है क्योंकि:

  • यह चश्मे के विपरीत है
  • यह JSON वैध स्ट्रिंग नहीं रह गया है

लेकिन यह काम करता है, जैसा आप चाहते हैं या नहीं।

नए पाठकों के लिए, हमेशा अपने json स्ट्रिंग्स के लिए दोहरे उद्धरण चिह्नों का उपयोग करें।


30
"एकल उद्धृत जिंग स्ट्रिंग्स" ? यह बकवास है; JSON में तार केवल कभी-दोहरे हो सकते हैं। JSON.parse("'foo'")उदाहरण के लिए, अपने ब्राउज़र कंसोल में प्रयास करें और निरीक्षण करें SyntaxError: Unexpected token '। JSON कल्पना वास्तव में इस बारे में सरल और स्पष्ट है। सिंगल उद्धरण के लिए JSON में कोई एस्केप सीक्वेंस नहीं है, और JSON स्ट्रिंग को सिंगल-कोटेड नहीं किया जा सकता है।
मार्क एमी

15
यहां तक ​​कि इस उत्तर के लिए स्पष्ट रूप से स्पष्ट अद्यतन खराब है। जबकि तकनीकी रूप से सच है, यह कहना भ्रामक है कि आपको भागने के लिए "ज़रूरत नहीं है"' , वैसे ही यह तकनीकी रूप से सच है लेकिन यह कहना कि भ्रामक रूप से आपको बच्चों की हत्या करने की आवश्यकता नहीं है । यह कहना सही होगा कि आप बच नहीं सकते'\'एक अवैध भागने का क्रम है, और यदि आप इसका उपयोग करते हैं तो आपका JSON वैध JSON नहीं है और कोई JSON पार्सर उस पर चोक कर देगा। (निश्चित रूप से जावास्क्रिप्ट JSON.parseऔर पायथन का json.loadsकरते हैं।)
मार्क अमेरी

2
यह उत्तर कई संपादन के बाद भी बकवास है। आप गलत तरीके से दावा करते हैं कि JSON में एकल-उद्धृत स्ट्रिंग्स का उपयोग करके और \'भागने के अनुक्रम का उपयोग करता है "काम करता है, जैसा कि आप इसे चाहते हैं या नहीं" । यह गलत है। मैं आपको किसी भी JSON पार्सर को लोकप्रिय उपयोग में प्रदर्शित करने के लिए चुनौती देता हूं जो एकल-उद्धृत स्ट्रिंग्स या \'अनुक्रम पर चोक नहीं करेगा । मैंने पहले ही बताया है कि JSON.parse("'foo'")और JSON.parse('"\\\'"') (जावास्क्रिप्ट में) json.loads("'foo'")और json.loads('"\\\'"')(पायथन में) दोनों अपवाद छोड़ देते हैं। क्या पृथ्वी पर अपने आधार है दावा इन निर्माणों "काम" का उपयोग कर उस के लिए?
मार्क अमेरी

10
@ Luv2code दिलचस्प उद्धरण। आप इसे थोड़ा गलत समझ रहे हैं; इसका मतलब यह नहीं है कि किसी भी चरित्र को केवल उसके सामने एक बैकस्लैश डालकर भाग निकला जा सकता है। एक फुलर उद्धरण है "कोई भी चरित्र बच सकता है। यदि चरित्र बुनियादी बहुभाषी विमान (U + FFFF के माध्यम से U + 0000) में है, तो इसे छह-वर्ण अनुक्रम के रूप में दर्शाया जा सकता है । ... वैकल्पिक रूप से, दो हैं। -च्रेकर अनुक्रम कुछ लोकप्रिय पात्रों के प्रतिनिधित्व से बच जाता है ”(जोर देकर मेरा)। यह कहावत है आप बच सकते हैं 'के रूप में \u0027, नहीं है कि आप इसे के रूप में बच सकते हैं \'
मार्क अमेरी जूल

2
@ Luv2code अभी भी, इसका मतलब है कि मेरी टिप्पणी ने कहा कि "आप बच नहीं सकते '" (और बच्चों की हत्या के लिए इस तरह की कार्रवाई की तुलना करना तकनीकी रूप से गलत है) अधिक सटीक यह कहना है कि आप इससे बच सकते हैं, बस के रूप में नहीं \'। मुझे यह महसूस नहीं हुआ कि कल्पना के RFC संस्करण ने अनुक्रमों को संदर्भित किया है जैसे \u0027कि वे जिन पात्रों का प्रतिनिधित्व करते हैं, वे 'बच' जाते हैं। प्रमुख बिंदु, जो \'अवैध है, हालांकि, अभी भी सही और महत्वपूर्ण है।
मार्क अमेरी जूल

361

मैं एक मूल विषय के बारे में इस तरह के अत्यधिक देखे जाने वाले प्रश्न पर उच्च-उत्कीर्ण गलत सूचनाओं की उपस्थिति से प्रसन्न हूं।

JSON तार एकल उद्धरण के साथ उद्धृत नहीं किया जा सकता है । कल्पना के विभिन्न संस्करण ( डगलस क्रॉकफोर्ड द्वारा मूल , ईसीएमए संस्करण , और आईईटीएफ संस्करण ) सभी राज्य हैं जो स्ट्रिंग को दोहरे उद्धरण के साथ उद्धृत किया जाना चाहिए। यह एक सैद्धांतिक मुद्दा नहीं है, और न ही एक राय के रूप में वर्तमान में सुझाए गए उत्तर; वास्तविक दुनिया में कोई भी JSON पार्सर त्रुटि देगा यदि आप इसे एक एकल-उद्धृत स्ट्रिंग पार्स करने का प्रयास करते हैं।

क्रॉकफोर्ड और ईसीएमए का संस्करण भी एक सुंदर चित्र का उपयोग करके स्ट्रिंग की परिभाषा को प्रदर्शित करता है, जिसे बिंदु को स्पष्ट रूप से बनाना चाहिए:

JSON युक्ति से एक स्ट्रिंग की परिभाषा दिखाती छवि

सुंदर तस्वीर भी JSON स्ट्रिंग के भीतर सभी वैध एस्केप दृश्यों को सूचीबद्ध करती है:

  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u चार-हेक्स अंकों के बाद

ध्यान दें, यहाँ कुछ अन्य उत्तरों में बकवास के विपरीत, \'एक JSON स्ट्रिंग में कभी भी एक मान्य भागने का क्रम नहीं है। यह होने की आवश्यकता नहीं है, क्योंकि JSON तार हमेशा दोहरे-उद्धृत होते हैं।

अंत में, आपको सामान्य रूप से JSON प्रोग्राम करते समय स्वयं से बचने के पात्रों के बारे में नहीं सोचना चाहिए (हालांकि निश्चित रूप से आप मैन्युअल रूप से संपादन करेंगे, कहते हैं, JSON- आधारित कॉन्फ़िग फ़ाइल)। इसके बजाय, उस डेटा संरचना को बनाएं, जिसे आप अपनी मातृभाषा, सरणी, स्ट्रिंग, संख्या, बूलियन और अपनी भाषा के प्रकारों का उपयोग करके एन्कोड करना चाहते हैं, और फिर JSON-एन्कोडिंग फ़ंक्शन के साथ JSON में एन्कोड करें। इस तरह के एक फ़ंक्शन को संभवतः जावास्क्रिप्ट JSON.stringify, PHP json_encode, या पायथन की तरह जो भी भाषा आप उपयोग कर रहे हैं, में बनाया गया हैjson.dumps। यदि आप ऐसी भाषा का उपयोग कर रहे हैं जिसमें ऐसी कार्यक्षमता नहीं है, तो आप संभवतः JSON पार्सिंग और एन्कोडिंग लाइब्रेरी का उपयोग कर सकते हैं। अगर आप चीजों को JSON से बदलने के लिए बस भाषा या लाइब्रेरी फ़ंक्शंस का उपयोग करते हैं, तो आपको JSON के बचने के नियमों को जानने की भी आवश्यकता नहीं होगी। यह वही गुमराह प्रश्न पूछने वाला है जो यहाँ किया जाना चाहिए था।


4 हेक्स बाइट्स या निबल्स ?
लेतबाकून

36

हर कोई कैसे से बचने के लिए के बारे में बात कर रही है 'एक में '-quoted स्ट्रिंग शाब्दिक। यहाँ एक बहुत बड़ा मुद्दा है: एकल-उद्धृत स्ट्रिंग शाब्दिक वैध JSON नहीं हैं । JSON जावास्क्रिप्ट पर आधारित है, लेकिन यह एक ही बात नहीं है। यदि आप जावास्क्रिप्ट कोड के अंदर ऑब्जेक्ट शाब्दिक लिख रहे हैं, तो ठीक है; यदि आपको वास्तव में JSON की आवश्यकता है, तो आपको उपयोग करने की आवश्यकता है "

डबल-उद्धृत स्ट्रिंग्स के साथ, आपको भागने की आवश्यकता नहीं होगी '। (और यदि आप "स्ट्रिंग में शाब्दिक चाहते हैं , तो आप उपयोग करेंगे \"।)


1
नमस्ते, आपने डबल-उद्धृत स्ट्रिंग्स के साथ कहा, आपको भागने की आवश्यकता नहीं होगी '। दुश्मन उदाहरण अगर मेरा स्ट्रिंग मूल्य है "Member's_id" : 4, क्या आप कह रहे हैं कि इसे भागने की ज़रूरत नहीं है? जाहिरा तौर पर मुझे एक समस्या हो रही है जहाँ इसकी गलत एन्कोडिंग की त्रुटि है: UTF-8 और इसे इस रूप में पढ़ा जा रहा है Member�s। यह मैन्युअल रूप से जेनरेट की गई जसन फाइल है।
शुभम

1
'JSON स्ट्रिंग शाब्दिक में बच नहीं जाना चाहिए। क्या आपने इसे कहीं से कॉपी-पेस्ट किया? शायद यह वास्तव में एक है \u2019, एक धर्मत्यागी नहीं। मेरा अनुमान है: किसी ने इसे एमएस वर्ड में टाइप किया, जिसने इसे एक उद्धरण चिह्न में बदल दिया क्योंकि यह सोचता है कि यह सबसे अच्छा जानता है। व्याकरणिक रूप से, अच्छा पुराना ASCII चरित्र एपोस्ट्रोफ ( 'उर्फ \x27, जिसे हम अब तक "एकल उद्धरण" कह रहे हैं) वह है जो आप चाहते हैं। लेकिन फिर भी अपने चरित्र एन्कोडिंग मुद्दे को ठीक करना अच्छा होगा, अगर ऐसी ही अन्य समस्याएं हैं। तो एक चरित्र एन्कोडिंग चुनें, और इसे पढ़ने और लिखने दोनों के लिए उपयोग करें। या प्रयोग से बच जाते हैं \u
डेविड नाइट 13

7

इनमें से अधिकांश उत्तर या तो प्रश्न का उत्तर नहीं देते हैं या स्पष्टीकरण में अनावश्यक रूप से लंबे हैं।

ठीक है, इसलिए JSON केवल दोहरे उद्धरण चिह्नों का उपयोग करता है, हमें वह मिलता है!

मैं JSON डेटा को सर्वर पर पोस्ट करने के लिए JQuery AJAX का उपयोग करने की कोशिश कर रहा था और फिर बाद में उसी जानकारी को वापस कर दिया। मेरे द्वारा पोस्ट किए गए प्रश्न का सबसे अच्छा समाधान उपयोग करना था:

var d = {
    name: 'whatever',
    address: 'whatever',
    DOB: '01/01/2001'
}
$.ajax({
    type: "POST",
    url: 'some/url',
    dataType: 'json',
    data: JSON.stringify(d),
    ...
}

यह आपके लिए पात्रों से बच जाएगा।

यह भी मार्क अमेरी, ग्रेट जवाब BTW द्वारा सुझाया गया था

आशा है कि यह किसी की मदद करता है।


0

हो सकता है कि मुझे पार्टी में बहुत देर हो गई हो, लेकिन यह एकल उद्धरण को पार्स / एस्केप करेगा (पार्स एस्केप पर लड़ाई में नहीं उतरना चाहता)।

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

0

प्रत्यक्ष प्रश्न का उत्तर:
सुरक्षित होने के लिए, आवश्यक वर्ण को \ u + 4-अंक-हेक्स-मान से बदलें

उदाहरण: यदि आप apostrophe से बचने के लिए चाहते हैं '\ u0027 के साथ बदलें
डी' एमिको D \ u0027Amico हो जाता है

नीस संदर्भ: http://es5.github.io/x7.html#x7.8.4

https://mathiasbynens.be/notes/javascript-escapes


-1 संदर्भों के लिए। सवाल JSON के बारे में है, लेकिन आपके लिंक किए गए संदर्भ जावास्क्रिप्ट के बारे में हैं, और सूची से बचने के क्रम हैं जो जावास्क्रिप्ट में मान्य नहीं हैं \'
मार्क अमेरी

धन्यवाद मार्क - मैं वास्तव में सिर्फ एक वैकल्पिक कोण देना चाहता था - जो यहां आता है, उसके आधार पर यह उपयोगी हो सकता है। लेकिन मैं JSON और जावास्क्रिप्ट के बारे में आपकी बात लेता हूं - मंचों पर एक निंजा होने के लिए धन्यवाद।
लुइगी डी 'अमिको

0

स्ट्रिंग को एनकोड करने के लिए एनकोडर्कोम्पोनेंट () का उपयोग करें।

उदाहरण के लिए। var product_list = encodeURIComponent (JSON.stringify (product_list));

आपको इसे डिकोड करने की आवश्यकता नहीं है क्योंकि वेब सर्वर स्वचालित रूप से ऐसा ही करता है।


0

टेम्पलेट शाब्दिक का उपयोग कर ...

var json = `{"1440167924916":{"id":1440167924916,"type":"text","content":"It's a test!"}}`;

-2

मुझे लगता है कि हम सभी सहमत एकल उद्धृत jsons असली jsons नहीं हैं। जैसा कि हो सकता है, हमारे लिए ऐसा करने के लिए पुस्तकालयों की अनुपस्थिति में, हमें अभी भी भागने के सवाल को संबोधित करने की आवश्यकता है "एक दोहरे उद्धृत जॉग स्ट्रिंग के भीतर।

प्रत्येक को "\" के साथ बदलना पर्याप्त नहीं है: उपयोगकर्ता इनपुट में प्रवेश कर सकता है: \ और पार्सिंग, फिर से, विफल रहता है (क्यों सोचें)।

इसके बजाय, पहले प्रत्येक \ with (डबल बैकस्लैश) को बदलें। तभी, प्रत्येक को "\" (बैकस्लैश और उसके बाद ") बदलें।


-2

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

/codereview/69266/json-conversion-to-single-quotes

\ 'अनुक्रम अमान्य है।


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

-15

एलेक्सबी की पोस्ट के बारे में:

 \'  Apostrophe or single quote
 \"  Double quote

सिंगल कोट्स से बचना सिंगल कोट्स जन्स स्ट्रिंग्स
में केवल मान्य होता है, डबल कोट्स से बचना केवल डबल कोट्स जॉगिंग स्ट्रिंग्स में मान्य होता है

उदाहरण:

'Bart\'s car'       -> valid
'Bart says \"Hi\"'  -> invalid

14
सिंगल उद्धृत स्ट्रिंग्स JSON में कानूनी नहीं हैं। JSON जावास्क्रिप्ट नहीं है। JSON एकल उद्धरण से बचने की अनुमति नहीं देता है। JSON सिंटैक्स के बहुत ही सरल दस्तावेज़ के लिए json.org देखें ।
srm

3
downvote - क्योंकि एकल उद्धरण jsons मान्य नहीं हैं!
डॉमिनिकअर्गर

एकल उद्धरण json में अमान्य हैं। यदि यह संभव है तो कृपया एक कार्य नमूना दिखाएं
रोहिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.