json_encode () आगे की स्लैश से बचकर


165

मैं JSON को Instagram से खींच रहा हूं:

$instagrams = json_decode($response)->data;

फिर डेटा को पुनर्गठन करने के लिए एक PHP सरणी में चर पार्स करते हुए, फिर फ़ाइल को पुन: एन्कोडिंग और कैशिंग करें:

file_put_contents($cache,json_encode($results));

जब मैं कैश फ़ाइल खोलता हूं तो मेरे सभी फ़ॉरवर्ड स्लैश "/" बच जाते हैं:

http:\/\/distilleryimage4.instagram.com\/410e7...

मैं अपनी खोजों से इकट्ठा json_encode()करता हूं जो स्वचालित रूप से ऐसा करता है ... क्या इसे अक्षम करने का कोई तरीका है?


2
यह वैकल्पिक है: "वर्ण जिन्हें बच जाना चाहिए: उद्धरण चिह्न, रिवर्स सॉलिडस, और नियंत्रण वर्ण (U + 001 के माध्यम से U + 001F)। कोई भी चरित्र बच सकता है।"
ThiefMaster

जवाबों:


285

क्या इसे निष्क्रिय करने का कोई तरीका है?

हां, आपको केवल JSON_UNESCAPED_SLASHESध्वज का उपयोग करने की आवश्यकता है ।

पहले पढ़ें महत्वपूर्ण : https://stackoverflow.com/a/10210367/367456 (आप जो काम कर रहे हैं - अपने दुश्मनों को जानें)

json_encode($str, JSON_UNESCAPED_SLASHES);

यदि आपके पास PHP 5.4 नहीं है, तो कई मौजूदा कार्यों में से एक को चुनें और उन्हें अपनी आवश्यकताओं के लिए संशोधित करें, जैसे http://snippets.dzone.com/posts/show/7487 (संग्रहीत प्रति)

उदाहरण डेमो

<?php
/*
 * Escaping the reverse-solidus character ("/", slash) is optional in JSON.
 *
 * This can be controlled with the JSON_UNESCAPED_SLASHES flag constant in PHP.
 *
 * @link http://stackoverflow.com/a/10210433/367456
 */    

$url = 'http://www.example.com/';

echo json_encode($url), "\n";

echo json_encode($url, JSON_UNESCAPED_SLASHES), "\n";

उदाहरण आउटपुट:

"http:\/\/www.example.com\/"
"http://www.example.com/"

2
यह उत्तर स्पष्ट है, लेकिन JSON के एनकोड के मानक के रूप में आपको इसे छोड़ देना चाहिए और फिर बच गए अंत में एस्कैपिंग php के लिए strip_slashesऔर JS phpjs.org/functions/stripslashes के
Barkarn01

1
@MartinBarker: यह केवल PHP 5.2.1 के साथ एक समस्या रही होगी: 3v4l.org/0AahO - JSON दोनों मामलों में मान्य है।
hakre

@MartinBarker कुछ अजीब कारण के लिए स्ट्रिप्स (), str_replace () या preg_replace () के साथ प्राप्त समाप्ति पर स्लैश स्ट्रिपिंग नहीं कर रहा था। इससे पहले कि मुझे यह उत्तर मिले, मैंने urlencode () का उपयोग करके स्लैश से छुटकारा पाने का एक तरीका हैक कर लिया और फिर% 2F को प्रतिस्थापित कर दिया। मैं विंडोज पर PHP7 का उपयोग कर रहा हूं। यकीन नहीं होता कि कुछ बग है, लेकिन मैजिक कोट्स को PHP7 में भी शामिल नहीं किया गया है, इसलिए केवल स्लैश को अक्षम करके हैकरी से बचना बेहतर है।
सामी फौद

@SamiFouad: स्लैश किए हुए के साथ भी, यह JSON सही है और इसे कोई समस्या नहीं पैदा करनी चाहिए (जब तक कि रिसीवर JSON को ठीक से हैंडल नहीं कर रहा है, json.org देखें , विशेष रूप से दाईं ओर का वर्ण विवरण, जो स्पष्ट \/रूप से वैध एस्केप अनुक्रम के रूप में नाम देता है /) , देख stackoverflow.com/a/10210367/367456 रूप में अच्छी तरह।
हक्रे

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

45

हां , लेकिन आगे की स्लैश से बचना अच्छी बात है । JSON के <script>टैग का उपयोग करते समय यह </script>कहीं भी आवश्यक है - एक स्ट्रिंग के अंदर भी - स्क्रिप्ट टैग समाप्त हो जाएगा।

निर्भर करता है कि JSON का उपयोग कहां किया गया है यह आवश्यक नहीं है, लेकिन इसे सुरक्षित रूप से अनदेखा किया जा सकता है।


5
तो जावास्क्रिप्ट स्वचालित रूप से बैकस्लैश को हटा देगा जब यह जसन में खींचता है, या यह कुछ जिसे मुझे निर्दिष्ट करने की आवश्यकता है?
माइकल सी।

5
यह स्वचालित रूप से इसे संभाल लेगा। कई अन्य भाषाओं की तरह, भाषा में एक विशेष अर्थ के बिना पात्रों से बचना सिर्फ उन पात्रों को छोड़ देता है।
ThiefMaster

19
@MichaelC। JSON में स्ट्रिंग मान "\/"बिल्कुल स्ट्रिंग मान के समान है "/"- और एक कार्य JSON पार्सर इसे इस तरह से व्यवहार करेगा। जावास्क्रिप्ट स्ट्रिंग्स पर भी यही नियम लागू होता है, इसलिए JSON को जावास्क्रिप्ट कोड के रूप में फीड करने से कोई परेशानी नहीं होगी। मुझे आश्चर्य है कि PHP के पास भी JSON_UNESCAPED_SLASHESझंडा है।
एसाइलिजा

4
लेकिन क्या होगा अगर कोई डेटा को JSON में एन्कोडिंग कर रहा है और फिर उन्हें एक डेटाबेस कॉलम में संग्रहीत कर रहा है? यदि प्रोग्राम में डेटाबेस की खातिर पात्रों को भागने के लिए कुछ तंत्र है, तो क्या यह सुविधा बहुत असुविधाजनक नहीं होगी क्योंकि अब स्लैश डबल-बच गए हैं?
Xavier_Ex

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

3

दूसरी तरफ, मैं PHPUNIT के साथ एक समस्या रख रहा था कि urls को एक url के बराबर या समाहित किया गया था जो कि json_encoded था -

मेरी उम्मीद:

http://localhost/api/v1/admin/logs/testLog.log

इनकोड किया जाएगा:

http:\/\/localhost\/api\/v1\/admin\/logs\/testLog.log

यदि आपको एक तुलना करने की आवश्यकता है, तो url का उपयोग करके रूपांतरण करें:

addcslashes($url, '/')

मेरी तुलना के दौरान उचित उत्पादन के लिए अनुमति दी।


0

मुझे इस तरह की स्थिति का सामना करना पड़ा, और बस,

str_replace("\/","/",$variable)

मेरे लिए काम किया।


-1

आपको आगे की स्लैश से बचने की आवश्यकता नहीं है! HTML5 और JS 'उद्धरण चिह्न के साथ-साथ "उद्धरण चिह्न का उपयोग करने की अनुमति देता है। इसलिए JSON में मैं टाइप करता हूं:

    "index4":{"<a href='http://example.com'>example</a>"}

वेबसाइट ev.bingo को कार्यशील उदाहरण के रूप में देखें: "v4": ["ऑडी ई-ट्रॉन Q4 स्पोर्टबैक एक MEPP मॉड्यूलर इलेक्ट्रिक प्रोपल्शन प्लेटफॉर्म का पूरी तरह से उपयोग करता है, जिसे वोक्सवैगन समूह के बीच साझा किया जाता है"],

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.