JSON: por que as barras dianteiras escaparam?

369

A razão para isso "me escapa".

O JSON escapa da barra, portanto, um hash {a: "a/b/c"}é serializado como em {"a":"a\/b\/c"}vez de {"a":"a/b/c"}.

Por quê?

Jason S
fonte
4
FWIW eu nunca vi barras escapou em JSON, eu só notei isso com a biblioteca Java no code.google.com/p/json-simple
Jason S
24
PHP do json_encode()escapa barras por padrão, mas tem a JSON_UNESCAPED_SLASHESopção a partir de PHP 5.4.0 (Março de 2012)
Walter Tross
6
Aqui está um código PHP que não escapará de todas as barras, apenas em '</':echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
rustyx 20/01
O código inclui o '</': ou começa em eco? Porque começar pelo eco falha para mim. Eu simplesmente não entendo nada. Sim, eu substituiu o meu $ obj para o meu variável :)
marciokoko
O JSON não escapa ou serializa nada ... o seu serializador JSON faz. Qual deles você está usando?
Lightness Races in Orbit

Respostas:

284

O JSON não exige que você faça isso, ele permite que você faça isso. Também permite usar "\ u0061" para "A", mas não é obrigatório. Permitir \/ajuda ao incorporar JSON em uma <script>tag, o que não permite</ strings internas, como Seb aponta.

Algumas APIs ASP.NET Ajax / JSON da Microsoft usam essa brecha para adicionar informações extras, por exemplo, um datetime será enviado como "\/Date(milliseconds)\/". (Que nojo)

Ruben
fonte
4
Isso seria uma coisa boa, escapando apenas </. Embora o JSON nem sempre seja incorporado nas tags de script.
Ruben
8
Consulte esta postagem do blog para obter a justificativa para o formato de data do ASP.NET JSON: weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
Michiel van Oosterhout
25
O JSON precisa ser substituído porque uma implementação específica de um serializador JSON gera algum JSON que ( embora seja JSON totalmente válido ) possui alguns caracteres extras, para que também possa ser inserido em um elemento de script HTML como um literal JS ?! Isso não é tanto jogar o bebê fora com a água do banho quanto jogá-lo fora porque alguém comprou para ele um conjunto de asas de água.
Quentin
15
O que eu não entendo é por que um serializador JSON se importaria até onde o JSON acaba. Em uma página da web, em uma solicitação HTTP, qualquer que seja. Deixe o renderizador final fazer codificação adicional, se necessário.
28516 Dan Ross
5
@ DanRoss E pode. Escapar /não é necessário , é permitido , para facilitar o uso de JSON. Se você não quiser fugir /, não faça.
Andreas
35

A especificação JSON diz que você pode escapar da barra, mas não precisa.

Harold L
fonte
9
Você pode adicionar um link a essa seção específica?
Ryan Gates
11
A especificação não diz isso. Na verdade, tudo o que diz é que você precisa escapar do personagem solidus. Veja ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Joa Ebert
10
@JoaEbert: Um solidus reverso deve ser escapado, mas você não precisa escapar de um solidus. A Seção 9 diz "Todos os caracteres podem ser colocados entre aspas, exceto os que devem ser escapados: aspas (U + 0022), solidus reverso (U + 005C) e os caracteres de controle U + 0000 a U + 001F. "
Harold L
4
Obrigado Harold! Você está certo, também mostrado na Figura 5, como "qualquer ponto de código, exceto ..." afirma claramente que / é opcional.
Joa Ebert
15

Eu fiz a mesma pergunta há algum tempo e tive que responder pessoalmente. Aqui está o que eu vim com:

Parece, meu primeiro pensamento [ que vem de suas raízes JavaScript ] estava correto.

'\/' === '/'em JavaScript e JSON é JavaScript válido. No entanto, por que os outros escapamentos ignorados (como\z ) não são permitidos no JSON?

A chave para isso foi ler http://www.cs.tut.fi/~jkorpela/www/revsol.html , seguido por http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2 . O recurso de escape da barra permite que o JSON seja incorporado em HTML (como SGML) e XML.

Boldewyn
fonte
5
Um mecanismo estruturado de entrega de carga útil de dados não deve estar vinculado a construções de linguagem ... pois isso pode mudar no futuro ... mas isso pode explicar as decisões de design se houver algum criador de JSON.
'\ /' === '/' Portanto, não preciso desmarcar barras ao receber meu jsonp?
Timmetje
8

O PHP escapa as barras dianteiras por padrão, e é provavelmente por isso que isso aparece com tanta frequência. Não sei por que, mas possivelmente porque a incorporação da corda "</script>"dentro de um<script> tag é considerada insegura.

Essa funcionalidade pode ser desativada passando a JSON_UNESCAPED_SLASHESflag, mas a maioria dos desenvolvedores não a usará, pois o resultado original já é JSON válido.

Simon East
fonte
5

PHP feio!

O JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESdeve ser padrão, não é uma opção (estranho) ... como dizê-lo para o PHP-desenvolvedores?

O padrão DEVE ser o uso mais frequente e os padrões (atuais) mais amplamente utilizados como UTF8. Quantos fragmentos de código PHP no Github ou em outro local precisam desse recurso exótico "incorporado em HTML"?

Peter Krauss
fonte
2
Direito disse! No entanto, o PHP promove todos os seus erros estranhos no futuro, para não quebrar nenhum dos bugs anteriores comuns em todos aqueles fragmentos históricos corrompidos do PHP que se espalham pelo mundo como uma praga. Portanto, todas as decisões erradas tomadas pelo PHP, o que significa que quase todas as decisões sobre o PHP já se tornaram o padrão. Você não pode esperar que os padrões mudem, portanto, todo desenvolvedor PHP deve conhecer e implementar todo esse número infinito de soluções alternativas contra todos os erros sérios encontrados no PHP. Digite stackoverflow ..
Tino
Você está completamente errado. É devido ao JavaScript. Como indicado abaixo. Em JS '\/' === '/'retorna true. Eu aconselho você a se ater aos fatos. A maioria das pessoas consegue lidar com alguns nomes de funções inconsistentes. Só porque você não pode ver o passado que não faz do PHP uma ferramenta ruim.
Cobolt
11
Oi @Cobolt, é uma pergunta antiga, não estou usando PHP hoje ... Mas, como blog de discussão, o núcleo é "O padrão DEVE ser o uso mais frequente" , portanto, a feia é ignorar esse "uso mais frequente" do comportamento (também feio) do Javascript.
Peter Krauss
11
Este não é o lugar para reclamar sobre nenhum idioma específico. Apontar o que o PHP atualmente faz e como desabilitá-lo teria sido mais útil, e uma resposta foi adicionada agora .
IMSoP 06/11/19