Saltar al contenido

jQuery.parseJSON arroja el error “JSON no válido” debido a una comilla simple escapada en JSON

Te sugerimos que revises esta respuesta en un entorno controlado antes de enviarlo a producción, un saludo.

Solución:

De acuerdo con el diagrama de la máquina de estado en el sitio web de JSON, solo se permiten caracteres de comillas dobles con escape, no comillas simples. No es necesario escapar los caracteres de comillas simples:

http://www.json.org/string.gif

Actualizar – Más información para los interesados:


Douglas Crockford no dice específicamente por qué la especificación JSON no permite comillas simples escapadas dentro de las cadenas. Sin embargo, durante su discusión sobre JSON en el Apéndice E de JavaScript: The Good Parts, escribe:

Los objetivos de diseño de JSON debían ser mínimos, portátiles, textuales y un subconjunto de JavaScript. Cuanto menos tengamos que estar de acuerdo para interoperar, más fácilmente podremos interoperar.

Entonces, tal vez decidió permitir que solo se definan cadenas usando comillas dobles, ya que esta es una regla menos que todas las implementaciones de JSON deben aceptar. Como resultado, es imposible que un carácter de comilla simple dentro de un string terminar accidentalmente el stringporque por definición un string solo puede terminar con un carácter de comillas dobles. Por lo tanto, no es necesario permitir el escape de un carácter de comilla simple en la especificación formal.


Profundizando un poco más, la implementación org.json de Crockford de JSON para Java es más permisible y lo hace permitir caracteres de comillas simples:

Los textos producidos por los métodos toString se ajustan estrictamente a las reglas de sintaxis JSON. Los constructores son más indulgentes en los textos que aceptarán:

  • Las cadenas se pueden citar con ‘ (comilla simple).

Esto lo confirma el código fuente de JSONTokener. los nextString El método acepta caracteres de comillas simples escapados y los trata como caracteres de comillas dobles:

public String nextString(char quote) throws JSONException {
    char c;
    StringBuffer sb = new StringBuffer();
    for (;;) {
        c = next();
        switch (c) {

        ...

        case '\':
            c = this.next();
            switch (c) {

            ...

            case '"':
            case ''':
            case '\':
            case '/':
                sb.append(c);
                break;
        ...

En la parte superior del método hay un comentario informativo:

El formato JSON formal no permite cadenas entre comillas simples, pero una implementación puede aceptarlas.

Por lo tanto, algunas implementaciones aceptarán comillas simples, pero no debe confiar en esto. Muchas implementaciones populares son bastante restrictivas en este sentido y rechazarán JSON que contenga cadenas entre comillas simples y/o comillas simples con escape.


Finalmente, para vincular esto con la pregunta original, jQuery.parseJSON primero intenta usar el analizador JSON nativo del navegador o una biblioteca cargada como json2.js cuando corresponda (que en una nota al margen es la biblioteca en la que se basa la lógica jQuery si JSON no está definido). Por lo tanto, jQuery solo puede ser tan permisivo como la implementación subyacente:

parseJSON: function( data ) 
    ...

    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) 
        return window.JSON.parse( data );
    

    ...

    jQuery.error( "Invalid JSON: " + data );
,

Hasta donde sé, estas implementaciones solo se adhieren a la especificación JSON oficial y no aceptan comillas simples, por lo tanto, jQuery tampoco.

Si necesita una comilla simple dentro de un stringdado que ‘ no está definido por la especificación, utilice u0027 ver http://www.utf8-chartable.de/ para todos ellos

editar: disculpe mi mal uso de la palabra backticks en los comentarios. Quise decir barra invertida. Mi punto aquí es que en el caso de que haya cadenas anidadas 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 comilla simple. Sin embargo, si no está anidado, es más fácil simplemente poner una cita simple y antigua allí.

Entiendo dónde radica el problema y cuando miro las especificaciones, está claro que las comillas simples sin escape deben analizarse correctamente.

Estoy usando la función jQuery.parseJSON de jquery para analizar el JSON string pero sigue recibiendo 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 paso final es que almaceno el JSON codificado string en una variable JS:


Si uso “” en lugar de ” todavía 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 otra forma de abordar este problema? ¿Mi código está mal o mal escrito?

Gracias

Te mostramos las comentarios y valoraciones de los lectores

Recuerda algo, que te damos el privilegio decir si diste con el resultado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *