2011-03-07 8 views
6

He la siguiente cadena JSON, codificado con PHP 5.2 json_encode():JSON.parse() problema con expresión regular valora

{"foo":"\\."} 

Este JSON cadena es válida. Puedes echarle un vistazo en http://www.jsonlint.com/

Sin embargo, el método nativo JSON.parse() (Chrome, Firefox), arroja el siguiente error, al analizar:

SyntaxError: Unexpected token ILLEGAL 

¿Alguien de ustedes saben, ¿por qué no puedo ¿parse escapó de metacargos de expresiones regulares?

Este ejemplo funciona:

{"foo":"\\bar"} 

Pero éste falla también:

{"foo":"\\?"} 

Por cierto: \. es sólo una expresión regular simple prueba, que quiero correr a través del objeto RegExp de JavaScript.

Gracias por su apoyo,

Dyvor

+3

Funciona para ''{" foo ":" \\\\? "}''. Entonces parece que tienes que "escapar dos veces" de los personajes. ''{" foo ":" \\ bar "}' ** parece ** funcionar (no arroja ningún error) pero el resultado será' {foo: "ar"} '. –

Respuesta

9

Se trata de "no trabajar" porque se está perdiendo un punto clave: hay dos cadena analiza pasando cuando se escribe en la consola de Chrome una línea como:

JSON.parse('{"foo": "\\."}'); 

El primera cuerdas El análisis se produce cuando el intérprete de JavaScript analiza la constante de cadena que está pasando al método "analizar()". El segundo análisis de cadena ocurre dentro del mismo analizador JSON. Después del primer pase, la doble barra invertida es solo una barra invertida.

Ésta:

{"foo":"\\bar"} 

obras porque "\ b" es una secuencia de escape dentro de la cadena válida.

+0

+1 Iba a escribir algo similar ... –

+0

+1 Pointy's right var test = {"foo": "\\ bar"}; Alerta (JSON.stringify (prueba)); // alerts '{"foo": "\\ bar"}'; var test2 = '{"foo": "\\ bar"}'; Alerta (JSON.stringify (JSON.parse (test2))); // alerts '{"foo": "\ bar"}'; – DefyGravity

+1

@DefyGravity No entiendo a qué te refieres. - oh, bien :-) – Pointy

0

añadir un conjunto adicional de \\, en cuanto a por qué funciona No estoy exactamente seguro.

JSON.parse('{"foo":"\\\\."}'); 
+0

Funciona porque hay dos análisis que suceden: el análisis de JavaScript de la constante de cadena codificada en la expresión de llamada a la función, y luego el análisis JSON de la cadena resultante. – Pointy

1

Me funciona en la consola Firebug.

>>> JSON.parse('"\\\\."'); 
"\." 

que es correcta en el analizador JSON recibe realmente "\\.", es decir, un barras invertidas esacped y un punto.

¿Te ha sucedido realmente el problema con la respuesta proveniente de PHP? ¿O solo en una prueba "manual"?

Cuestiones relacionadas