JSON: फ़ॉरवर्ड स्लैश क्यों बच गए हैं?


369

इसका कारण मुझे "बच" जाता है।

JSON आगे की स्लैश से बच जाता है, इसलिए एक हैश {a: "a/b/c"}को {"a":"a\/b\/c"}इसके बजाय क्रमबद्ध किया जाता है {"a":"a/b/c"}

क्यों?


4
FWIW मैंने JSON में भागे हुए आगे के स्लैश को कभी नहीं देखा है, मैंने अभी इसे Java लाइब्रेरी के साथ code.google.com/p/json-simple
जेसन एस

24
PHP json_encode()डिफ़ॉल्ट रूप से फ़ॉरवर्ड स्लैश से बच जाती है, लेकिन JSON_UNESCAPED_SLASHESविकल्प PHP 5.4.0 (मार्च 2012) से शुरू होता है
वाल्टर ट्रॉस

6
यहां एक PHP कोड है जो हर स्लैश से बच नहीं जाएगा, केवल में '</':echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
rustyx

क्या कोड में '</' शामिल है: या क्या यह प्रतिध्वनि पर शुरू होता है? क्योंकि प्रतिध्वनि पर शुरू करना मेरे लिए विफल हो जाता है। मैं बस कुछ भी नहीं मिलता है। हां मैंने अपने चर के लिए अपनी $ obj बदल दी :)
marciokoko

JSON कुछ भी नहीं बचता है या क्रमबद्ध नहीं करता है ... आपका JSON सीरियलाइज़र करता है। कौन सा एक आप प्रयोग कर रहें है?
कक्षा

जवाबों:


284

JSON को आपको ऐसा करने की आवश्यकता नहीं है, यह आपको ऐसा करने की अनुमति देता है। यह आपको "ए" के लिए "\ u0061" का उपयोग करने की भी अनुमति देता है, लेकिन इसकी आवश्यकता नहीं है। अनुमति देने से \/JSON को एक <script>टैग में एम्बेड करने में मदद मिलती है , जो </अंदर के तार की अनुमति नहीं देता है, जैसे कि एसईबी बताते हैं।

Microsoft के ASP.NET Ajax / JSON API में से कुछ अतिरिक्त जानकारी जोड़ने के लिए इस खामियों का उपयोग करते हैं, उदाहरण के लिए, एक डेटाटाइम के रूप में भेजा जाएगा "\/Date(milliseconds)\/"। (नीरस)


4
यह एक अच्छी बात होगी, बस भागना /। हालांकि JSON अक्सर स्क्रिप्ट टैग में एम्बेडेड नहीं होता है।
Ruben

8
ASP.NET JSON तिथि प्रारूप के लिए तर्क के लिए इस ब्लॉग पोस्ट को देखें: weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
Michiel van Oosterhout

25
JSON को बदलने की आवश्यकता है क्योंकि JSON सीरियल के एक विशेष कार्यान्वयन में कुछ JSON आउटपुट करता है जो ( पूरी तरह से वैध JSON होने पर ) कुछ अतिरिक्त वर्ण हैं, इसलिए इसे एक HTML स्क्रिप्ट तत्व में JS शाब्दिक के रूप में भी गिराया जा सकता है ?! यह स्नान के पानी के साथ बच्चे को बाहर फेंकने के लिए इतना नहीं है क्योंकि बच्चे ने उसे पानी के पंखों का एक सेट खरीदा है।
क्वेंटिन

15
जो मुझे नहीं मिलता, वह यह है कि एक JSON सीरियलाइज़र भी परवाह करेगा जहाँ JSON समाप्त होता है। एक वेब पेज पर, HTTP अनुरोध में, जो भी हो। अंतिम रेंडरर को अतिरिक्त एन्कोडिंग करने दें, यदि उसे इसकी आवश्यकता है।
डैन रॉस

5
@DanRoss और यह कर सकते हैं। एस्केपिंग /है नहीं की आवश्यकता है, यह है की अनुमति दी , JSON के उपयोग को कम करने के। यदि आप बचना नहीं चाहते हैं /, तो न करें।
एंड्रियास

35

JSON का कहना है कि आप आगे की स्लैश से बच सकते हैं, लेकिन आपके पास नहीं है।


9
क्या आप उस विशिष्ट अनुभाग का लिंक जोड़ सकते हैं?
रयान गेट्स

1
कल्पना यह नहीं कहती है कि वास्तव में यह सब कहता है कि आपको ठोस चरित्र से बचना होगा। देखें ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
जोया एबर्ट

10
@ जोएबर्ट: एक रिवर्स सॉलिडस से बच जाना चाहिए, लेकिन आपको एक सॉलिडस से बचने की जरूरत नहीं है। धारा 9 कहती है, "सभी वर्णों को उद्धरण चिह्नों के अलावा रखा जा सकता है जिन्हें छोड़ना चाहिए: उद्धरण चिह्न (U + 0022), रिवर्स सॉलिडस (U + 005C), और नियंत्रण वर्ण U + 0000 से U 001F। "
हेरोल्ड एल

4
धन्यवाद हेरोल्ड! आप सही हैं, चित्र 5 में भी दिखाया गया है, "किसी भी कोड बिंदु को छोड़कर ..." स्पष्ट रूप से बताता है कि / वैकल्पिक है।
जोया एबर्ट

15

मैंने कुछ समय पहले भी यही सवाल पूछा था और मुझे इसका जवाब देना था। यहाँ मैं क्या लेकर आया हूँ:

ऐसा लगता है, मेरा पहला विचार [ कि यह इसकी जावास्क्रिप्ट जड़ों से आता है ] सही था।

'\/' === '/'जावास्क्रिप्ट में, और JSON है मान्य JavaScript। हालांकि, \zJSON में अन्य उपेक्षित बच (जैसे ) की अनुमति क्यों नहीं है?

इसके लिए कुंजी http://www.cs.tut.fi/~jkorpela/www/revsol.html पढ़ रहा था , इसके बाद http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2 । स्लैश एस्केप की सुविधा JSON को HTML (SGML) और XML के रूप में एम्बेड करने की अनुमति देती है।


5
एक संरचित डेटा पेलोड डिलीवरी तंत्र को भाषा के निर्माणों से बंधा नहीं होना चाहिए..क्योंकि यह भविष्य में बदल सकता है ... लेकिन यह डिज़ाइन निर्णयों को समझा सकता है यदि कोई JSON निर्माता थे।

'\ /' === '' / 'तो मुझे अपने jsonp प्राप्त करते समय आगे स्लैश को अनसेक करने की आवश्यकता नहीं है?
टाइममेट्ज

8

PHP डिफ़ॉल्ट रूप से फ़ॉरवर्ड स्लैश से बच जाती है, जो शायद इसीलिए ऐसा प्रतीत होता है। मुझे यकीन नहीं है कि क्यों, लेकिन संभवतः क्योंकि टैग के "</script>"अंदर स्ट्रिंग को एम्बेड करना <script>असुरक्षित माना जाता है।

इस कार्यक्षमता को JSON_UNESCAPED_SLASHESध्वज में पास करके अक्षम किया जा सकता है लेकिन अधिकांश डेवलपर्स इसका उपयोग नहीं करेंगे क्योंकि मूल परिणाम पहले से ही वैध JSON है।


5

बदसूरत PHP!

JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESडिफ़ॉल्ट होना चाहिए, न कि एक (अजीब) विकल्प ... कैसे php-डेवलपर्स के लिए यह कहना?

डिफ़ॉल्ट सबसे अक्सर प्रयोग होना चाहिए, और (वर्तमान) UTF8 के रूप में मानकों सबसे व्यापक रूप से इस्तेमाल किया। जीथब या अन्य जगह में कितने PHP-कोड के टुकड़े को "HTML में एम्बेडेड" इस एक्सोक्टिक की आवश्यकता है?


2
सही कहा है! हालाँकि, PHP भविष्य में सभी अजीब त्रुटियों को बढ़ावा देता है, उन सभी भ्रष्ट ऐतिहासिक PHP स्निपेट्स में आम पिछले बगों में से किसी को भी नहीं तोड़ने के लिए जो कीट की तरह दुनिया भर में फैलता है। इसलिए PHP द्वारा लिए गए उन सभी गलत निर्णयों का मतलब है कि PHP पर लगभग सभी निर्णय, मानक बन जाते हैं। आप मानकों को बदलने की उम्मीद नहीं कर सकते हैं, इसलिए हर एक PHP डेवलपर को PHP में पाए गए उन सभी गंभीर बगों के खिलाफ उन सभी अनन्त संख्याओं को जानना और लागू करना होगा।
Tino

आप पूरी तरह से गलत हैं। यह जावास्क्रिप्ट के कारण है। जैसा कि नीचे बताया गया है। जेएस में '\/' === '/'सच है। मैं आपको तथ्यों से चिपके रहने की सलाह दूंगा। अधिकांश लोग कुछ असंगत फ़ंक्शन नामों के साथ सामना करने में सक्षम हैं। सिर्फ इसलिए कि आप अतीत को नहीं देख सकते हैं जो PHP को एक बुरा उपकरण नहीं बनाता है।
कोबोल्ट

1
हाय @Cobolt, यह एक पुराना सवाल है, मैं आज PHP का उपयोग नहीं कर रहा हूं ... लेकिन, चर्चा ब्लॉग के रूप में, कोर "डिफ़ॉल्ट रूप से सबसे अधिक बार उपयोग किया जाना चाहिए" है , इसलिए कुरूपता इस "सबसे लगातार उपयोग" को अनदेखा करने के बारे में है (भी बदसूरत) जावास्क्रिप्ट का व्यवहार।
पीटर क्रस

1
यह किसी विशेष भाषा के बारे में शेख़ी करने की जगह नहीं है। यह बताते हुए कि PHP वर्तमान में क्या करता है, और इसे कैसे निष्क्रिय करना है, यह अधिक उपयोगी होगा, और एक उत्तर अब जोड़ा गया है जो ऐसा करता है
IMSoP
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.