json_encode - print json php
json parse error con comillas dobles (7)
Una comilla doble, incluso si se escapó, arroja un error de análisis.
mira el siguiente código
//parse the json in javascript
var testJson = ''{"result": ["lunch", "/"Show/""] }'';
var tags = JSON.parse(testJson);
alert (tags.result[1]);
Esto arroja un error de análisis debido a las comillas dobles (que ya se han escapado).
Incluso eval()
no funcionará aquí.
Pero si me escapo con doble barras como esta:
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?
php to javascript Object (php> = 5.3.0)
var storesLocations = JSON.parse(''<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>'');
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, debe escapar correctamente sus citas en php, y luego escapar de ellas y sus barras de escape con 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 no he escrito errores tipográficos).
De los docs
JSON_HEX_APOS
(entero) Todos ''se convierten en / u0027
JSON_HEX_QUOT
(entero) Todos "se convierten en / u0022
json_encode () toma dos argumentos, el valor y las opciones. Entonces intenta
json_encode($result, JSON_HEX_QUOT); // or
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS);
No he intentado esto sin embargo.
Desactive magic_quotes_gpc
en php.ini .
Este problema es causado por el mecanismo de escape de cadena doble: uno proviene de JS y el otro proviene de JSON.
Una combinación del carácter de barra diagonal inversa combinada con otro carácter siguiente se usa para representar un carácter que de otra manera no es representable dentro de la cadena. '''' // '''' significa ''/', etc.
Este mecanismo de escape tiene lugar antes de que JSON.parse () funcione.
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 cadenas, pasa cuatro barras invertidas ''/' en el intérprete de JavaScript.
Desde la perspectiva del intérprete de JavaScript, se entiende que hay dos backlashes (/) ya que cada secuencia ''//' se interpretará como una ''/'.
Desde la perspectiva del analizador JSON, recibe dos contracciones (//) y las reglas de escape de cadenas JSON lo analizarán como una sola ''/', que es el resultado de salida.
Explica tu 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]);
Javascript deshace sus cadenas y json también los deshace. 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 de comillas dobles.
La segunda cadena ''{"result": ["lunch", "///"Show///""] }''
primero se descataloga a {"result": ["lunch", "/"Show/""] }
(y eso está correctamente desactivado por json).
Creo que ese ''{"result": ["lunch", "//"Show//""] }''
debería funcionar también.
Si se agregan los escapes C estándar, entonces JSON.parse
convertirá secuencias como /"
into "
, //
into /
, /n
en un avance de línea, etc.
''foo//bar/nbaz"'' === JSON.parse(''"foo////bar//nbaz//""'')
En el caso de nuestro proyecto:
cadena original ""{/"lat/":28.4594965,/"lng/":77.0266383}""
Después de pasar a JSON.parse()
"{"lat":28.4594965,"lng":77.0266383}"
En el 2º pase a JSON.parse()
{lat: 28.4594965, lng: 77.0266383}
Observe que JSON.parse()
eliminó los caracteres de escape en lugar de convertir la string
en object
.
Después de eliminar los caracteres de escape, funcionó la conversión de cadena a objeto.
Aquí está la demostración:
while (typeof p1 != ''object'') {
p1 = JSON.parse(p1);
pass++;
console.log(''On pass '', pass, p1);
}