2010-06-30 24 views
11

Dado que el formato JSON especifica que las comillas simples no se deben escapar, la mayoría de las bibliotecas (o incluso el analizador JSON nativo) fallarán si tiene una comilla simple escapada. Ahora, esto generalmente no es un problema ya que la mayoría de las veces haces un XHR que recupera algunos datos formateados como JSON y usas el texto de respuesta que contiene la cadena JSON que luego puedes analizar, etc.¿Cómo usar una cadena literal JSON?

En esta situación particular, Tengo una cadena JSON almacenada en una base de datos como texto ... entonces la base de datos contiene algo como {"property":"value"} y quiero mostrar esto como parte de una página HTML creada por el servidor para que el código JavaScript en esa página se vea así:

var x = '{"property":"value"}'; 

Ahora bien, si la cadena JSON en la base de datos contiene una comilla simple como esto:

{"property":"val'ue"} 

Entonces necesito escapar de ella o de lo que nunca seré capaz de utilizarlo como una cadena:

console.clear(); 
var obj = {prop:"val'ue"}; 
var str = JSON.stringify(obj); 
console.log("JSON string is %s",str); 
console.dir(JSON.parse(str)); //No problem here 


//This obviously can't work since the string is closed and it causes an invalid script 
//console.dir(JSON.parse('{prop:"val'ue"}')); 

//so I need to escape it to use a literal JSON string 
console.dir(JSON.parse('{"prop":"val\'ue"}')); 

entonces la pregunta es ¿por qué no se considera {"prop":"val\'ue"} una cadena JSON válida?

+0

Entonces, ¿cuál es el problema con 'console.dir (JSON.parse ('{" prop ":" val \' ue "} '))'? funciona para mí (cromo) – mykhal

+0

Correcto, mi pregunta era más por qué esto consideraba JSON no válido {"prop": "valu \ 'ue"} (según las especificaciones) cuando en una situación como la que describo necesitas tener esto en tu cadena. Esto me obliga a volver a procesar una cadena JSON ya codificada. – SBUJOLD

Respuesta

4

En JavaScript - la cadena '{"prop":"val\'ue"}' es una manera correcta para codificar el JSON como una cadena literal .

Como el intérprete de JavaScript lee la cadena de una sola cita, convertirá el \' en '. El valor de la cadena es {"prop":"val'ue"} que es JSON válido.

Con el fin de crear la cadena no válida JSON, que tendría que escribir '{"prop":"val\\\'ue"}'

Si entiendo la pregunta correcta, que están tratando de generar el código JavaScript que establecer alguna variable a la versión decodificada de una Cadena JSON que ha almacenado en la base de datos. Así que ahora está codificando la cadena de nuevo, ya que la forma de obtener esta cadena en JavaScript es usar una cadena literal, pasando por JSON.parse(). Probablemente pueda confiar en usar el codificador JSON del lado del servidor para codificar la cadena JSON como un literal de cadena de JavaScript. Por ejemplo:

<?php $jsonString = '{"prop":"val\'ue"}'; ?> 
var myJson = JSON.parse(<?php echo json_encode($jsonString) ?>); 
// Prints out: 
// var myJson = JSON.parse("{\"prop\":\"val'ue\"}"); 
// And results: Object - { prop: "val'ue"} 

Sin embargo, si está 100% seguro de que el JSON va a ser válida, y no es necesario el peso de la comprobación de análisis/error adicional - vaya directamente todo lo que acaba de codificación adicional y escribe:

var myJson = <?php echo $jsonString; ?> 

¡Recuerda, JSON es una sintaxis JavaScript válida para definir objetos después de todo!

+1

Thx, definitivamente me equivoqué al pensar, lo mejor es volver a codificarlo como dices, de esta manera la El intérprete de javaScript almacenará el valor de la cadena 'interpretada', haciendo que el VALOR de la variable sea una cadena JSON válida. – SBUJOLD

+0

@SBUJOLD - no hay problema :) ¡me alegro de poder guiarte por el camino correcto! – gnarf

+1

+1 Buena explicación. – amelvin

2

Según jsonlint es válida sin escapar la comilla simple, por lo que esto está muy bien:

{"prop": "val'ue"} 

Pero esto no es válido:

{"prop":"val\'ue"} 

Según json.org JSON:

es completamente independiente del lenguaje, pero usa convenciones que son fa miliar a programadores del C-familia de idiomas, incluyendo C, C++, C#, Java, JavaScript, Perl, Python, y muchos otros

Por lo que es las convenciones lingüísticas en lenguas de tipo C con respecto al solidus inverso (\) eso significa que su ejemplo no es válido.

+0

+1 esto definitivamente responde al "Por qué' '' no es válido en cadenas JSON "parte de la pregunta – gnarf

1

Puede intentar lo siguiente, sin embargo, es feo.

JSON.parse("{\"obj\":\"val'ue\"}");

O simplemente almacenar la cadena en un primer var. Esto no debería almacenar el valor literal de la barra diagonal inversa y, por lo tanto, el analizador JSON debería funcionar.


var str = '{"obj" : "val\'ue"}'; 
JSON.parse(str);