[Javascript] jQuery.parseJSON arroja el error "JSON no válido" debido a una comilla simple escapada en JSON


Answers

Si necesita una comilla simple dentro de una cadena, ya que \ 'no está definida por la especificación, use \u0027 consulte http://www.utf8-chartable.de/ para todas ellas.

editar: disculpen mi uso indebido de la palabra backticks en los comentarios. Me refiero a la barra invertida. Mi punto aquí es que, en el caso de que haya anidado cadenas dentro de otras cadenas, creo que puede ser más útil y legible usar unicode en lugar de muchas barras invertidas para escapar de una sola comilla. Si no está anidado, sin embargo, es más fácil simplemente poner una cita antigua simple allí.

Question

jQuery.post() solicitudes a mi servidor utilizando jQuery.post() y mi servidor devuelve objetos JSON (como { "var": "value", ... } ). Sin embargo, si alguno de los valores contiene una comilla simple (escapada correctamente como \' ), jQuery no puede analizar una cadena JSON válida. Aquí hay un ejemplo de lo que quiero decir ( hecho en la consola de Chrome ):

data = "{ \"status\": \"success\", \"newHtml\": \"Hello \\\'x\" }";
eval("x = " + data); // { newHtml: "Hello 'x", status: "success" }

$.parseJSON(data); // Invalid JSON: { "status": "success", "newHtml": "Hello \'x" }

¿Esto es normal? ¿No hay forma de pasar correctamente una sola cotización a través de JSON?




Interesante. ¿Cómo está generando su JSON en el extremo del servidor? ¿Estás utilizando una función de biblioteca (como json_encode en PHP) o estás creando la cadena JSON a mano?

Lo único que llama mi atención es el apóstrofo de escape ( \' ). Al ver que estás usando comillas dobles, como de hecho deberías, no hay necesidad de escapar de las comillas simples. No puedo verificar si esa es la causa del error de jQuery, ya que aún no me he actualizado a la versión 1.4.1.




Entiendo dónde se encuentra el problema y cuando miro las especificaciones queda claro que las comillas simples sin esbozar deben analizarse correctamente.

Estoy usando la función jQuery.parseJSON de jquery para analizar la cadena JSON, pero obtengo el error de análisis cuando hay una comilla simple en los datos que se preparan con json_encode.

¿Podría ser un error en mi implementación que se ve así (PHP - lado del servidor):

$data = array();

$elem = array();
$elem['name'] = 'Erik';
$elem['position'] = 'PHP Programmer';
$data[] = json_encode($elem);

$elem = array();
$elem['name'] = 'Carl';
$elem['position'] = 'C Programmer';
$data[] = json_encode($elem);

$jsonString = "[" . implode(", ", $data) . "]";

El último paso es almacenar la cadena codificada JSON en una variable JS:

<script type="text/javascript">
employees = jQuery.parseJSON('<?=$marker; ?>');
</script>

Si utilizo "" en lugar de "", aún arroja un error.

SOLUCIÓN:

Lo único que funcionó para mí fue usar la máscara de bits JSON_HEX_APOS para convertir las comillas simples de esta manera:

json_encode($tmp, JSON_HEX_APOS);

¿Hay alguna otra forma de abordar este problema? ¿Está mi código incorrecto o mal escrito?

Gracias