2012-04-18 15 views
122

ja ciągnąc JSON z Instagram:json_encode() ucieczki ukośnik

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

Następnie przetwarzania zmiennych pod tablicy PHP restrukturyzacji danych, a następnie ponownego kodowania i buforowanie plik

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

Gdy otwieram plik cache całe ukośniki "/" są uciekł:

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

Z moich wyników wyszukiwania wynika, że ​​json_encode() automatycznie to robi ... Czy istnieje sposób, aby je wyłączyć?

+1

Jest to opcjonalne: "znaki, które muszą być zmienione: znak cudzysłowu, reverse solidus i znaki sterujące (U + 0000 do U + 001F). Każda postać może być zmieniona." – ThiefMaster

Odpowiedz

187

Czy istnieje sposób, aby go wyłączyć?

Tak, wystarczy użyć flagi JSON_UNESCAPED_SLASHES. !

ważne przeczytać przed: https://stackoverflow.com/a/10210367/367456 (wiem co masz do czynienia z - znać wroga)

json_encode($str, JSON_UNESCAPED_SLASHES); 

Jeśli nie masz pod ręką PHP 5.4, wybrać jedną z wiele istniejących funkcji i dostosuj je do swoich potrzeb, np 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"; 

Przykład Wydajność:

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

Szukałem godzin na to, dlaczego mój ciąg base64 insing json jest zepsuty ... dzięki! –

+0

Ta odpowiedź jest grate, ale kodowanie JSON w standardzie powinieneś zostawić jako escaped, a następnie w reciving końcu cofnąć php 'strip_slashes' i dla JS http://phpjs.org/functions/stripslashes/ –

+1

@MartinBarker: To może były problemem tylko w PHP 5.2.1: http://3v4l.org/0AahO - JSON jest ważny w obu przypadkach. – hakre

31

Yes, ale nie - escaping forward slashes is a good thing. Gdy używasz znaczników JSON wewnątrz <script>, konieczne jest, aby gdziekolwiek - nawet wewnątrz łańcucha - kończy się tag skryptu.

W zależności od miejsca, w którym używany jest JSON, nie jest to konieczne, ale można go bezpiecznie zignorować.

+4

Tak samo javascript automatycznie usunie ukośniki odwrotne, gdy pociągnie json, czy coś, co muszę podać? –

+4

Automatycznie to obsłuży. Podobnie jak w wielu innych językach, unikanie postaci bez specjalnego znaczenia w tym języku pozostawia je w spokoju. – ThiefMaster

+16

@MichaelC. W JSON wartość ciągu '" \/"' jest dokładnie taka sama jak wartość ciągu '"/"' - i działający analizator składni JSON potraktuje go jako taki. Ta sama zasada dotyczy ciągów javascript, więc karmienie JSON-a jako kodu javascriptowego również nie będzie miało żadnych problemów. Jestem zaskoczony, że PHP ma nawet flagę "JSON_UNESCAPED_SLASHES". – Esailija

2

Z drugiej strony, to było to, że problem z phpunit stwierdzając adresów URL został zawarty w lub równa adres URL, który został json_encoded -

Oczekiwany:

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

będzie kodowany do:

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

Jeśli trzeba zrobić porównanie, przekształcając url:

addcslashes($url, '/')

dopuszczone do właściwego wyjścia podczas moich porównań.