2010-09-16 13 views
12

estoy usando json_encode en PHP para codificar una URL¿Por qué el codificador JSON agrega caracteres de escape al codificar URL?

$json_string = array ('myUrl'=> 'http://example.com'); 
echo json_encode ($json_string); 

El código anterior genera la siguiente cadena JSON:

{"myUrl":"http:\/\/example.com"} 

En lugar de

{"myUrl":"http://example.com"} 

sólo soy novato, que salida es correcta? ¿El analizador JSON puede evaluar la segunda salida correctamente?

Respuesta

8

Supongo que los escritores de esa función agregaron esa codificación innecesaria a través de nada más que simple ignorancia. El escapado de barras diagonales es no es necesario.

Una cantidad sorprendentemente grande de programadores que he conocido son igual de malos al mantener sus barras diagonales rectas como en el resto del mundo. Y un número aún mayor es realmente pobre al hacer la codificación y decodificación correctamente.

Actualización:

Después de hacer algunas búsquedas, me encontré con this discussion. Trae a colación un buen punto que escapando un / a veces es necesario para los analizadores de HTML malos. Me he encontrado con un problema de una vez en cuando IE 6 trata incorrectamente el contenido de la siguiente manera:

<script> 
    var json = { scriptString: "<script> /* JavaScript here */ </script>" }; 
</script> 

IE 6 vería la </script> dentro de la cadena y cerrar la etiqueta de script demasiado pronto. Por lo tanto, esto es más segura IE 6 (aunque la etiqueta script abertura en cadena también podría romper cosas ... No puedo recordar):

<script> 
    var json = { scriptString: "<script> \/* JavaScript here *\/ <\/script>" }; 
</script> 

Y también dicen que algunos analizadores malas verían el // en http:// y trata el resto de la línea como un comentario de JavaScript.

Parece que se trata de un caso más de tecnologías de Internet secuestradas por Browser Fail.

+1

Estoy de acuerdo. Pero vale la pena señalar que la cadena resultante * es * válida. En las cadenas de javascript, puede escapar del carácter * any * precediéndolo con una barra diagonal inversa. Entonces "\ /" es interpretado por Javascript simplemente como '/'. – Lee

+1

JSON no es lo mismo que JavaScript. En JSON no tienes permitido hacer una barra diagonal inversa en lo que quieras. Pero, curiosamente, puedes hacer una barra diagonal inversa en una cadena, por lo que sigue siendo válida. :) – hobbs

9

Según http://www.json.org/, uno debe escapar de ese carácter, aunque no es estrictamente necesario en JavaScript:

strings

también leyeron related bug report en php.net para una breve discusión.

Ver 2.5 del RFC:

caracteres Todo Unicode pueden ser colocados dentro de las comillas a excepción de los caracteres que deben ser escaparon: comilla, solidus inversa y los caracteres de control (U + 0000 a U + 001F).

Se pueden escapar todos los caracteres.

Por lo tanto, no suena como que necesita ser escapado, pero puede ser, y el sitio web (y un diagrama de texto en el RFC) ilustra como siendo escapado.

-2

Veo otro problema aquí. El resultado de cadena {"myUrl":"http://example.com"} no debe tener el nombre de miembro myUrl cotizado. En JavaScript y JSON, creo que todos los identificadores de miembro literal de objeto son cadenas sin comillas. Entonces, esperaría que el resultado fuera {myUrl:"http://example.com"}.

Esto parece un error demasiado grande en PHP, así que debo estar equivocado.

Editar, 11/11/11: Sí, estoy equivocado. La sintaxis JSON requiere que incluso los nombres de campo estén entre comillas dobles.

4

Si está utilizando php 5.4 puede usar las opciones json_encode. ver el manual.

Se agregaron varias opciones en php 5.3 pero JSON_UNESCAPED_SLASHES en 5.4.

Cuestiones relacionadas