2012-04-18 27 views
122

मैं इंस्टाग्राम से JSON खींच कर रहा हूँ:json_encode() आगे भागने स्लैश

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

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

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

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

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

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

+1

यह वैकल्पिक है: "वर्ण जो बच जाना चाहिए: उद्धरण चिह्न, रिवर्स ठोस, और नियंत्रण वर्ण (यू +0000 यू +001 एफ के माध्यम से)। कोई भी चरित्र बच सकता है।" – ThiefMaster

उत्तर

187

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

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

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

json_encode($str, JSON_UNESCAPED_SLASHES); 

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

Example Demo

<?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/" 
+0

मैं इसके लिए घंटों की तलाश कर रहा था, क्यों मेरा बेस 64 स्ट्रिंग जेसन को तोड़ रहा है ... धन्यवाद! –

+0

यह उत्तर grate है लेकिन JSON एन्कोड मानक के रूप में आपको इसे बचने के रूप में छोड़ देना चाहिए और फिर प्राप्त करने वाले अंत में भागने वाले PHP की 'strip_slashes' और जेएस के लिए http://phpjs.org/functions/stripslashes/ –

+1

@MartinBarker: यह हो सकता है केवल PHP 5.2.1 के साथ एक समस्या हुई है: http://3v4l.org/0AahO - JSON दोनों मामलों में मान्य है। – hakre

31

Yes, लेकिन escaping forward slashes is a good thing नहीं। <script> टैग के अंदर JSON का उपयोग करते समय यह </script> के रूप में कहीं भी आवश्यक है - यहां तक ​​कि एक स्ट्रिंग के अंदर - स्क्रिप्ट टैग समाप्त हो जाएगा।

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

+4

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

+4

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

+16

@ माइकल सी। JSON में स्ट्रिंग मान '" \/"' स्ट्रिंग मान के समान है "/" ​​'- और एक काम कर रहे JSON पार्सर इस तरह से इलाज करेगा। जावास्क्रिप्ट स्ट्रिंग पर एक ही नियम लागू होता है, इसलिए जेएसओएन को जावास्क्रिप्ट कोड के रूप में खिलाकर कोई परेशानी नहीं होगी। मुझे हैरान है कि PHP में 'JSON_UNESCAPED_SLASHES' ध्वज भी है। – Esailija

2

दूसरा पहलू पर, मैं PHPUnit जोर देते हुए यूआरएल में कुछ समस्या आ रहा था में निहित थी या एक यूआरएल है कि json_encoded गया था के बराबर -

मेरी उम्मीद:

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

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

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

आप एक तुलना करने की जरूरत है, तो यूआरएल का उपयोग कर बदलने:

addcslashes($url, '/')

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

संबंधित मुद्दे