2009-06-04 106 views
42

Una comilla doble, incluso si se ha escapado, arroja un error de análisis.
vistazo al código de abajojson error de análisis con comillas dobles

//parse the json in javascript 
var testJson = '{"result": ["lunch", "\"Show\""] }'; 
var tags = JSON.parse(testJson); 
alert (tags.result[1]); 

Esto es tirar error de análisis debido a las comillas dobles (que ya se escaparon).
Incluso eval() no funcionará aquí.
Pero si me escape con dos barras como esto:

var result = '{"result": ["lunch", "\\"Show\\""] }'; 
var tags = JSON.parse(result); 
alert (tags.result[1]); 

entonces funciona bien.
¿Por qué tenemos que usar doble barra aquí en javascript? El problema es que la función PHP json_encode() escapa a una comilla doble con una sola barra (como esta: \"show\") que JSON.parse no podrá analizar. ¿Cómo manejo esta situación?

+1

var eval ('(' + resultan + ')'); – Priya

Respuesta

29

Bueno, finalmente, el análisis de JSON usa la misma evaluación, por lo que no hay diferencia cuando les das algo. con sintaxis incorrecta En este caso, usted tiene que escapar correctamente sus cotizaciones en php, y luego escapar de ellos y su escape con barras diagonales json_encode

<?php 
    $json = '{"result": ["lunch", "\"Show\""] }'; 
    echo json_encode($json); 
?> 

OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }" 

Esto debería funcionar en el lado del cliente JS (si es que he hecho sin faltas de ortografía).

+1

. Pero esto es algo que debería ser atendido por la función json_encode(). ¿Por qué devuelve algo que JSON.parse() no puede analizar correctamente? – Varun

+0

¿Esto significa que php_encode() tiene errores ... ?? – Varun

+7

No es un error en json_encode (supongo que eso es lo que querías decir). json_encode no está destinado a crear literales de cadenas de JavaScript, por lo que no hace el escape adicional. –

33

Javascript unescapes sus cadenas y json las desampara también. la primera cadena ('{"result": ["lunch", "\"Show\""] }') es vista por el analizador json como {"result": ["lunch", ""Show""] }, porque \" en javascript significa ", pero no sale de la cadena entre comillas dobles.

La segunda cadena '{"result": ["lunch", "\\\"Show\\\""] }' se desenchufa por primera vez a {"result": ["lunch", "\"Show\""] } (y Json no la ajusta correctamente).

Creo que '{"result": ["lunch", "\\"Show\\""] }' debería funcionar también.

+5

+1 Esta es realmente la respuesta correcta – Christian

8

Desde el docs

JSON_HEX_APOS (número entero) ALL 'se convierten en \ u0027
JSON_HEX_QUOT (integer) All "se convierten a \ u0022

json_encode() toma dos argumentos, el valor y las opciones. Por lo tanto, intente

json_encode($result, JSON_HEX_QUOT); // or 
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS); 

I have not t Sin embargo, esto

+1

Advertencia: json_encode() espera exactamente 1 parámetro, 2 dado en ... –

+1

Está utilizando una versión de PHP anterior a 5.3.0, entonces, como lo indican los documentos. – raylu

+0

Esa es la respuesta, pero debería haber sido el comportamiento predeterminado para comenzar con – nus

2

Desactivar magic_quotes_gpc en php.ini.

10

Este problema está causado por el mecanismo de escape de dos cadenas: uno proviene de JS y el otro de JSON.

Una combinación de la barra diagonal inversa combinada con otro carácter siguiente se utiliza para representar un carácter que no se puede representar en la cadena. '' \\ '' significa '\', etc.

Este mecanismo de escape tiene lugar antes de que funcione JSON.parse().

por ejemplo,

var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}'); 
console.log(parsedObj.sentence); 
>>>"It is one backslash(\)" 

Desde la perspectiva del generador de cadena, pasa cuatro contragolpes '\' en el intérprete de JavaScript.

Desde el punto de vista del intérprete de JavaScript, se trata de , hay dos imágenes diagonales (\) ya que cada secuencia '\\' se interpretará como una '\'.

Desde la perspectiva del analizador JSON, recibe dos barras diagonales (\\) y las reglas de escape de cadena JSON la analizarán como una sola '\' que es el resultado de salida.

Cómo explicas primer código:

var testJson = '{"result": ["lunch", "\"Show\""] }'; 
//The real string after sequence escaping in to JS is 
//'{"result": ["lunch", ""Show""] }' 
//which is passed into the JSON.parse. 
//Thus, it breaks the JSON grammar and generates an error 
var tags = JSON.parse(testJson); 
alert (tags.result[1]); 
+2

+1 para la explicación detallada – Izkata

1

php para JavaScript Object (PHP> = 5.3.0)

var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>'); 
Cuestiones relacionadas