Pregunta

Una doble cita incluso si escapó es tirar el error de análisis.
mirar el siguiente código

//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 escapó).
Incluso eval() no funcionará aquí.
Pero si me escape con dos barras como esta:

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

entonces funciona bien.
¿Por qué tenemos que utilizar una doble barra aquí en javascript? El problema es que la función de PHP json_encode() escapa una doble cita con una sola barra (como esto: \"show\"), que JSON.parse no será capaz de analizar. ¿Cómo puedo manejar esta situación?

¿Fue útil?

Solución

Bueno, por fin, de análisis de JSON utiliza el mismo eval, así que no hay diferencia cuando se les da algo bajo. con una 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 JS del lado del cliente (si es que he hecho sin faltas de ortografía).

Otros consejos

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

La segunda cadena se '{"result": ["lunch", "\\\"Show\\\""] }' primer representan literalmente a {"result": ["lunch", "\"Show\""] } (y que está literalmente de forma correcta por JSON).

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

Este problema es causado por el mecanismo de escape de dos plegado cadena: uno proviene de JS y uno proviene de JSON

.

Una combinación de la barra invertida combinado con otro carácter que sigue se utiliza para representar un carácter que no es otra cosa representable dentro de la cadena. '' \\ '' significa '\', etc.

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

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, cuatro pases de contragolpes '\' en el intérprete de JavaScript.

Desde la perspectiva del interpretor JavaScript, que inteprets hay dos contragolpes (\) ya que cada '\\' secuencia será interpretado como una '\'.

Desde la perspectiva del analizador JSON, que recibe dos contragolpes (\\) y las reglas de escape de cadena JSON lo procesa como una sola '\' que es el resultado de la salida.

Puede explicar 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]);

Desde el docs

  

JSON_HEX_APOS (integer) Todos 'se convierten en \ u0027
  JSON_HEX_QUOT (integer) All "se convierten en \ u0022

json_encode () toma dos argumentos, el valor y opciones. Así que trate

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

No he probado esto, sin embargo.

Desactivar magic_quotes_gpc en php.ini .

php a javascript Object (php> = 5.3.0)

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

Si se añaden los escapes C estándar, entonces JSON.parse convertirá secuencias como \" en ", \\ en \, \n en una línea de alimentación, etc.

'foo\\bar\nbaz"' === JSON.parse('"foo\\\\bar\\nbaz\\""')

En el caso de nuestro proyecto:

""{\"lat\":28.4594965,\"lng\":77.0266383}"" cadena original

Después de pasar a JSON.parse()

"{"lat":28.4594965,"lng":77.0266383}"

El 2 nd Pass a JSON.parse()

{lat: 28.4594965, lng: 77.0266383}

Tenga en cuenta que JSON.parse() eliminado escapar caracteres en lugar de convertir a string object.

Después se eliminaron los personajes escapan, la cadena de oponerse conversión trabajó.

Aquí está la demostración:

while (typeof p1 != 'object') {
  p1 = JSON.parse(p1);
  pass++;
  console.log('On pass ', pass, p1);
}

Esto podría ayudar:

<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top