JSON: ¿por qué se escapan las barras diagonales?

369

La razón de esto "se me escapa".

JSON escapa de la barra diagonal, por lo que un hash {a: "a/b/c"}se serializa como en {"a":"a\/b\/c"}lugar de {"a":"a/b/c"}.

¿Por qué?

Jason S
fuente
44
FWIW Nunca he visto barras diagonales escapadas en JSON, solo lo noté con la biblioteca de Java en code.google.com/p/json-simple
Jason S
24
PHP json_encode()escapa por barras diagonales por defecto, pero tiene la JSON_UNESCAPED_SLASHESopción a partir de PHP 5.4.0 (marzo de 2012)
Walter Tross
66
Aquí hay un código PHP que no escapará a cada barra, solo en '</':echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
rustyx
¿El código incluye el '</': o comienza en echo? Porque comenzar en echo falla para mí. Simplemente no consigo nada. Sí, reemplacé mi $ obj por mi variable :)
marciokoko
JSON no escapa ni serializa nada ... su serializador JSON sí. Cual estas usando?
Carreras de ligereza en órbita

Respuestas:

284

JSON no requiere que hagas eso, te permite hacerlo. También le permite usar "\ u0061" para "A", pero no es obligatorio. Permitir \/ayuda al incrustar JSON en una <script>etiqueta, que no permite </cadenas internas, como señala Seb.

Algunas de las API ASP.NET Ajax / JSON de Microsoft usan esta laguna para agregar información adicional, por ejemplo, se enviará una fecha y hora como "\/Date(milliseconds)\/". (Qué asco)

Rubén
fuente
44
Eso sería algo bueno, escapando solo </. Aunque JSON no suele estar integrado en las etiquetas de script de todos modos.
Ruben
8
Consulte esta publicación de blog para conocer la justificación del formato de fecha ASP.NET JSON: weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
Michiel van Oosterhout
25
¿JSON necesita ser reemplazado porque una implementación particular de un serializador JSON genera algo de JSON que ( aunque es JSON completamente válido ) tiene algunos caracteres adicionales para que también se pueda colocar en un elemento de script HTML como un literal JS ?! Eso no es tanto tirar al bebé con el agua del baño como tirar al bebé porque alguien le compró un juego de alas de agua.
Quentin
15
Lo que no entiendo es por qué a un serializador JSON le importaría dónde termina el JSON. En una página web, en una solicitud HTTP, lo que sea. Deje que el renderizador final realice una codificación adicional, si lo necesita.
Dan Ross el
55
@DanRoss Y puede. /No se requiere escapar , está permitido , para facilitar el uso de JSON. Si no quieres escapar /, entonces no lo hagas.
Andreas
35

La especificación JSON dice que PUEDES escapar de la barra diagonal, pero no tienes que hacerlo.

Harold L
fuente
99
¿Puedes agregar un enlace a esa sección específica?
Ryan Gates
1
La especificación no dice eso. De hecho, todo lo que dice es que tienes que escapar del personaje solidus. Ver ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Joa Ebert
10
@JoaEbert: se debe escapar un solidus inverso, pero no es necesario escapar de un solidus. La Sección 9 dice "Todos los caracteres se pueden colocar entre comillas, excepto los caracteres que se deben escapar: comillas (U + 0022), solidus inverso (U + 005C) y los caracteres de control U + 0000 a U + 001F. "
Harold L
44
Gracias Harold! Tiene razón, también se muestra en la Figura 5, ya que "cualquier punto de código excepto ..." establece claramente que / es opcional.
Joa Ebert
15

Hice la misma pregunta hace algún tiempo y tuve que responderla yo mismo. Esto es lo que se me ocurrió:

Parece que mi primer pensamiento [ que proviene de sus raíces de JavaScript ] fue correcto.

'\/' === '/'en JavaScript, y JSON es JavaScript válido. Sin embargo, ¿por qué los otros escapes ignorados (como \z) no están permitidos en JSON?

La clave para esto fue leer http://www.cs.tut.fi/~jkorpela/www/revsol.html , seguido de http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2 . La característica de la barra diagonal permite que JSON se incruste en HTML (como SGML) y XML.

Boldewyn
fuente
55
Un mecanismo de entrega de carga útil de datos estructurados no debe estar vinculado a construcciones de lenguaje ... ya que esto puede cambiar en el futuro ... pero esto podría explicar las decisiones de diseño si hubiera alguno de los creadores de JSON.
'\ /' === '/' Entonces, ¿no necesito quitar las barras diagonales al recibir mi jsonp?
Timmetje
8

PHP escapa a las barras diagonales por defecto, lo que probablemente sea la razón por la que esto aparece con tanta frecuencia. No estoy seguro de por qué, pero posiblemente porque incrustar la cadena "</script>"dentro de una <script>etiqueta se considera inseguro.

Esta funcionalidad se puede deshabilitar pasando el JSON_UNESCAPED_SLASHESindicador, pero la mayoría de los desarrolladores no la usarán ya que el resultado original ya es JSON válido.

Simon East
fuente
5

PHP feo!

La JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESopción debe ser predeterminada, no una opción (extraña) ... ¿Cómo decirlo a los desarrolladores php?

El valor predeterminado DEBE ser el uso más frecuente y los estándares (actuales) más utilizados como UTF8. ¿Cuántos fragmentos de código PHP en Github u otro lugar necesitan esta característica exótica "incrustada en HTML"?

Peter Krauss
fuente
2
Bien dicho! Sin embargo, PHP promueve todos sus errores extraños en el futuro, para no romper ninguno de los errores anteriores comunes en todos esos fragmentos de PHP históricos corruptos que se extienden por todo el mundo como una plaga. Por lo tanto, todas esas decisiones incorrectas tomadas por PHP, lo que significa que casi todas las decisiones sobre PHP, se convierten en el estándar. No puede esperar que los estándares cambien, por lo tanto, cada desarrollador PHP debe conocer e implementar todas esas soluciones infinitas contra todos los errores graves encontrados en PHP. Ingrese stackoverflow ..
Tino
Estás completamente equivocado Es debido a JavaScript. Como se señala a continuación. En JS '\/' === '/'devuelve verdadero. Le aconsejaría que se atendiera a los hechos. La mayoría de las personas pueden hacer frente a algunos nombres de funciones inconsistentes. El hecho de que no puedas ver el pasado no hace que PHP sea una mala herramienta.
Cobolt
1
Hola @Cobolt, es una vieja pregunta, no estoy usando PHP hoy ... Pero, como blog de discusión, el núcleo es "El valor predeterminado DEBE ser el uso más frecuente" , por lo que la fealdad se trata de ignorar este "uso más frecuente" del comportamiento (también feo) de Javascript.
Peter Krauss el
1
Este no es el lugar para despotricar sobre ningún idioma en particular. Señalar lo que PHP hace actualmente y cómo deshabilitarlo habría sido más útil, y ahora se ha agregado una respuesta que lo hace .
IMSoP el