json_encode () escapando de barras

164

Estou puxando JSON do Instagram:

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

Em seguida, analise as variáveis ​​em uma matriz PHP para reestruturar os dados, recodifique e armazene em cache o arquivo:

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

Quando abro o arquivo de cache, todas as minhas barras "/" estão sendo escapadas:

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

Eu recolho das minhas pesquisas que json_encode()faz isso automaticamente ... existe uma maneira de desativá-lo?

Michael C.
fonte
2
É opcional: "os caracteres que devem ser escapados: aspas, solidus reverso e os caracteres de controle (U + 0000 a U + 001F). Qualquer caractere pode ser escapado."
ThiefMaster

Respostas:

284

Há uma forma de desabilitá-lo?

Sim, você só precisa usar a JSON_UNESCAPED_SLASHESbandeira.

! leia antes: https://stackoverflow.com/a/10210367/367456 (saiba com o que está lidando - conheça seu inimigo)

json_encode($str, JSON_UNESCAPED_SLASHES);

Se você não possui o PHP 5.4 em mãos, escolha uma das muitas funções existentes e modifique-as de acordo com suas necessidades, por exemplo, http://snippets.dzone.com/posts/show/7487 (cópia arquivada) .

Demo de exemplo

<?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";

Saída de exemplo:

"http:\/\/www.example.com\/"
"http://www.example.com/"
hakre
fonte
2
Essa resposta é desmontando mas JSON Encode como padrão, você deve deixá-lo como escapou e, em seguida, no final reciving desfazer o php escapar de strip_slashese para JS phpjs.org/functions/stripslashes
Barkermn01
1
@ MartinBarker: Isso pode ter sido um problema apenas no PHP 5.2.1: 3v4l.org/0AahO - O JSON é válido nos dois casos.
hakre
@MartinBarker Por alguma razão estranha, a barra não foi removida no lado receptor com stripslashes (), str_replace () ou preg_replace (). Antes de encontrar essa resposta, criei uma maneira de se livrar da barra usando urlencode () e substituindo% 2F. Estou usando o PHP7 no Windows. Não tenho certeza se existe algum bug em algum lugar, mas as aspas mágicas nem sequer estão incluídas no PHP7, portanto, é melhor evitar a invasão simplesmente desativando as barras.
Sami Fouad
@SamiFouad: Mesmo com o JSON cortado, ele está correto e não deve causar problemas (a menos que o destinatário não esteja lidando com o JSON corretamente, consulte json.org , especialmente a descrição do char no lado direito, que nomeia explicitamente \/como sequência de escape válida /) , consulte stackoverflow.com/a/10210367/367456 também.
26717 hakre
PHP feio! a opção JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESdeve ser padrão, não (estranha) ... Como dizê-lo aos desenvolvedores php?
Peter Krauss
45

Sim , mas não - escapar de barras é uma coisa boa . Ao usar JSON dentro de <script>tags, é necessário que </script>qualquer lugar - mesmo dentro de uma string - termine a tag de script.

Dependendo de onde o JSON é usado, não é necessário, mas pode ser ignorado com segurança.

ThiefMaster
fonte
5
Então, o javascript removerá automaticamente as barras invertidas quando puxar o json, ou isso é algo que preciso especificar?
18712 Michael C.
5
Ele irá lidar com isso automaticamente. Como em muitos outros idiomas, os caracteres de escape sem um significado especial no idioma apenas os deixam em paz.
ThiefMaster
19
@MichaelC. No JSON, o valor da string "\/"é exatamente o mesmo que o valor da string "/"- e um analisador JSON em funcionamento o tratará como tal. A mesma regra se aplica às seqüências de caracteres javascript, portanto, alimentar JSON como um código javascript também não terá problemas. Estou surpreso que o PHP tenha a JSON_UNESCAPED_SLASHESbandeira.
Esailija 10/08/12
4
Mas e se alguém estiver codificando os dados no JSON e depois armazenando-os em uma coluna do banco de dados? Se o programa tiver algum mecanismo para escapar caracteres por causa do banco de dados, esse recurso não seria muito inconveniente, já que agora as barras estão com escape duplo?
Xavier_Ex 22/09
5
Despejar JSON em tags de script sem uma etapa de codificação, supondo que a implementação JSON estava escapando de barras, parece uma prática que certamente o morderá.
23917 Ryan
3

Por outro lado, eu estava tendo um problema com o PHPUNIT ao afirmar que os URLs estavam contidos ou eram iguais a um URL que era json_encoded -

meu esperado:

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

seria codificado para:

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

Se você precisar fazer uma comparação, transformando o URL usando:

addcslashes($url, '/')

permitido a saída adequada durante minhas comparações.

Esquadrões
fonte
0

Eu tive que encontrar uma situação como tal, e simplesmente, o

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

funcionou para mim.

Anton De Rose
fonte
-1

Você não precisa escapar de barras! HTML5 e JS permitem usar 'aspas e "aspas. Portanto, em JSON, digite:

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

Veja o site ev.bingo como exemplo de trabalho: "v4": ["O Audi e-tron Q4 Sportback utiliza totalmente uma plataforma de propulsão elétrica modular MEPP, que é compartilhada entre o Grupo Volkswagen"],

mcc
fonte