¿Cómo escapar de caracteres especiales en la construcción de una cadena JSON?

200

Aqui esta mi cuerda

{
    'user': {
        'name': 'abc',
        'fx': {
            'message': {
                'color': 'red'
            },
            'user': {
                'color': 'blue'
            }
        }
    },
    'timestamp': '2013-10-04T08: 10: 41+0100',
    'message': 'I'mABC..',
    'nanotime': '19993363098581330'
}    

Aquí el mensaje contiene comillas simples, que es igual a la cita utilizada en JSON. Lo que hago es llenar una cadena de entradas de usuario como mensaje. Entonces, necesito escapar de ese tipo de escenarios especiales que rompen el código. Pero, aparte del reemplazo de cadena, ¿hay alguna forma de hacer que escapen, pero aún así permitir que HTML los procese de nuevo al mensaje correcto?

dinesh707
fuente
45
JSON usa solo comillas dobles, no comillas simples, vea json.org
Niels Bom
44
RFC 4627 establece que los analizadores deben poder analizar JSON conforme (párrafo 4) y pueden admitir extensiones adicionales que no sean JSON. Sin embargo, el párrafo 5 establece enfáticamente que todos los productores (generadores) DEBEN producir SOLO JSON 100% compatible. Producir JSON con caracteres de marco que no necesitan escapar es una idea especialmente mala. Considere reemplazar sus apóstrofes con comillas. ietf.org/rfc/rfc4627.txt
Luv2code del
3
@ Luv2code Si bien los puntos que está haciendo siguen siendo ciertos, tenga en cuenta que cita una especificación obsoleta. Cuando lea RFC, use siempre la versión tools.ietf.org/html , no la versión de texto. Las versiones HTML son más fáciles de leer y enlazan a subsecciones de, y lo más importante, en la parte superior de las versiones HTML hay una lista de todos los RFC posteriores que actualizan u obsoletos el que está leyendo. Si hubiera ido a tools.ietf.org/html/rfc4627 , habría visto que RFC 4627 está obsoleto y ha sido reemplazado por RFC 7159 .
Mark Amery
3
Para las personas que lean esto en el futuro, RFC 7159 ha quedado obsoleto por tools.ietf.org/html/rfc8259
Joram van den Boezem

Respuestas:

286

Una cadena JSON debe estar entre comillas dobles, de acuerdo con las especificaciones , por lo que no necesita escapar '.
Si tiene que usar caracteres especiales en su cadena JSON, puede escapar usando \caracteres.

Vea esta lista de caracteres especiales utilizados en JSON:

\b  Backspace (ascii code 08)
\f  Form feed (ascii code 0C)
\n  New line
\r  Carriage return
\t  Tab
\"  Double quote
\\  Backslash character


Sin embargo, incluso si es totalmente contrario a las especificaciones, el autor podría usar \' .

Esto es malo porque:

  • ES contrario a las especificaciones
  • Ya no es una cadena válida JSON

Pero funciona, como quieras o no.

Para los nuevos lectores, use siempre comillas dobles para sus cadenas json.

AlexB
fuente
30
¿"cadenas json con comillas simples" ? Esto no tiene sentido; las cadenas en JSON solo pueden ser entre comillas dobles. Pruebe JSON.parse("'foo'")en la consola de su navegador, por ejemplo, y observe el SyntaxError: Unexpected token '. La especificación JSON es realmente simple y clara sobre esto. No hay una secuencia de escape en JSON para comillas simples, y una cadena JSON no puede ser comilla simple.
Mark Amery
15
Incluso la supuesta actualización aclaratoria de esta respuesta es mala. Si bien es técnicamente cierto, es engañoso decir que "no necesita" escapar ', de la misma manera que es técnicamente cierto pero engañoso decir que legalmente no es necesario asesinar niños. Más correcto sería decir que no puedes escapar '. \'es una secuencia de escape ilegal, y si la usa, su JSON no es JSON válido y cualquier analizador JSON se ahogará. (Ciertamente, JavaScript JSON.parsey Python json.loadshacen.)
Mark Amery
2
Esta respuesta sigue siendo una tontería después de muchas ediciones. Afirma, erróneamente, que usar cadenas entre comillas simples en JSON y usar la \'secuencia de escape "funciona, como quiera o no" . Esto es falso Le desafío a que exhiba cualquier analizador JSON de uso popular que no se ahogue en cadenas de comillas simples o en la \'secuencia. Ya he señalado que JSON.parse("'foo'")y JSON.parse('"\\\'"') (en JavaScript) y json.loads("'foo'")y json.loads('"\\\'"')(en Python) lanzan excepciones. ¿Cuál es su base para la afirmación de que el uso de estas construcciones "funciona"?
Mark Amery
10
@ Luv2code cita interesante. Lo estás malinterpretando ligeramente; que no quiere decir que cualquier personaje puede escapar simplemente poniendo una barra invertida delante de él. Una cita más completa es "Cualquier carácter puede escapar. Si el personaje está en el Plano Multilingüe Básico (U + 0000 a U + FFFF), entonces puede representarse como una secuencia de seis caracteres ... Alternativamente, hay dos -la secuencia de caracteres escapa de las representaciones de algunos personajes populares "(énfasis mío). Está diciendo que puedes escapar 'como \u0027, no es que puedas escapar como \'.
Mark Amery
2
@ Luv2code aún, significa que mi comentario votado afirmando que "no puedes escapar '" (¡y comparar tal acto con el asesinato de niños!) Es técnicamente incorrecto; más exacto es decir que puedes escapar de él, solo que no \'. No me había dado cuenta de que la versión RFC de la especificación se refería a secuencias \u0027como una forma de 'escapar' de los personajes que representan. Sin \'embargo, el punto clave que es ilegal sigue siendo cierto e importante.
Mark Amery
362

Estoy horrorizado por la presencia de información errónea muy votada sobre una pregunta tan altamente vista sobre un tema básico.

Las cadenas JSON no se pueden citar con comillas simples . Las diversas versiones de la especificación ( el original de Douglas Crockford, la versión ECMA y la versión IETF ) establecen que las cadenas deben ser citadas con comillas dobles. Este no es un tema teórico, ni una cuestión de opinión como sugiere actualmente la respuesta aceptada; cualquier analizador JSON en el mundo real generará un error si intenta que analice una cadena entre comillas simples.

La versión de Crockford y ECMA incluso muestra la definición de una cadena usando una imagen bonita, lo que debería dejar el punto claramente claro:

Imagen que muestra la definición de una cadena de la especificación JSON

La imagen bonita también enumera todas las secuencias de escape legítimas dentro de una cadena JSON:

  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u seguido de cuatro dígitos hexadecimales

Tenga en cuenta que, al contrario de las tonterías en algunas otras respuestas aquí, \' nunca es una secuencia de escape válida en una cadena JSON. No es necesario que sea así, porque las cadenas JSON siempre tienen comillas dobles.

Finalmente, normalmente no debería pensar en escapar de los caracteres usted mismo cuando genera JSON mediante programación (aunque, por supuesto, lo hará cuando edite manualmente, por ejemplo, un archivo de configuración basado en JSON). En su lugar, forme la estructura de datos que desea codificar utilizando cualquier mapa nativo, matriz, cadena, número, tipo booleano y nulo que tenga su idioma, y ​​luego codifíquelo en JSON con una función de codificación JSON. Tal función probablemente esté integrada en el lenguaje que esté utilizando, como JavaScript JSON.stringify, PHP json_encodeo Python.json.dumps. Si está utilizando un lenguaje que no tiene dicha funcionalidad incorporada, probablemente pueda encontrar una biblioteca de codificación y análisis JSON para usar. Si simplemente usa las funciones de lenguaje o biblioteca para convertir cosas hacia y desde JSON, nunca necesitará saber las reglas de escape de JSON. Esto es lo que el preguntante equivocado aquí debería haber hecho.

Mark Amery
fuente
4 bytes hexadecimales o mordiscos ?
Leetbacoon
36

Todos hablan de cómo escapar 'en un 'literal de cadena entre comillas. Aquí hay un problema mucho mayor: los literales de cadena entre comillas simples no son JSON válidos . JSON se basa en JavaScript, pero no es lo mismo. Si está escribiendo un objeto literal dentro del código JavaScript, está bien; si realmente necesita JSON, debe usarlo ".

Con cadenas entre comillas dobles, no necesitará escapar del '. (Y si quisieras un literal "en la cadena, lo usarías \").

David Knipe
fuente
1
Hola, dijiste con cadenas entre comillas dobles, no necesitarás escapar del '. Por ejemplo, si mi valor de cadena es "Member's_id" : 4, ¿estás diciendo que no necesita escapar? Aparentemente estoy teniendo un problema donde está dando un error de codificación incorrecta: UTF-8 y se está leyendo como Member�s. Es un archivo json generado manualmente.
Shubham
1
'en un literal de cadena JSON no se debe escapar. ¿Lo copiaste y lo pegaste en alguna parte? Quizás sea realmente \u2019un apóstrofe, no un apóstrofe. Mi suposición: alguien lo escribió en MS Word, lo que lo convirtió en una comilla porque cree que lo sabe mejor. Gramaticalmente, el viejo apóstrofe de caracteres ASCII (es decir ', al \x27que hemos estado llamando "comillas simples" hasta ahora) es el que desea. Pero aún así sería bueno solucionar el problema de codificación de caracteres, en caso de que haya otros problemas similares. Elija una codificación de caracteres y úsela tanto para lecturas como para escrituras. O escapar usando \u.
David Knipe el
7

La mayoría de estas respuestas no responden la pregunta o son innecesariamente largas en la explicación.

OK, entonces JSON solo usa comillas dobles, ¡lo entendemos!

Estaba tratando de usar JQuery AJAX para publicar datos JSON en el servidor y luego devolver esa misma información. La mejor solución a la pregunta publicada que encontré fue usar:

var d = {
    name: 'whatever',
    address: 'whatever',
    DOB: '01/01/2001'
}
$.ajax({
    type: "POST",
    url: 'some/url',
    dataType: 'json',
    data: JSON.stringify(d),
    ...
}

Esto escapará de los personajes por ti.

Esto también fue sugerido por Mark Amery, Gran respuesta por cierto

Espero que esto ayude a alguien.

Patear el culo
fuente
0

Puede ser que sea demasiado tarde para la fiesta, pero esto analizará / escapará la comilla simple (no quiero entrar en una batalla en analizar vs escapar).

JSON.parse("\"'\"")
YankTHEcode
fuente
0

La respuesta a la pregunta directa:
para estar seguro, reemplace el carácter requerido con \ u + valor de 4 dígitos hexadecimal

Ejemplo: si desea escapar del apóstrofe 'reemplace con \ u0027
D'Amico se convierte en D \ u0027Amico

BONITA REFERENCIA: http://es5.github.io/x7.html#x7.8.4

https://mathiasbynens.be/notes/javascript-escapes

Luigi D'Amico
fuente
-1 para las referencias. La pregunta es sobre JSON, pero sus referencias vinculadas son sobre JavaScript y enumeran secuencias de escape que no son válidas en JavaScript \'.
Mark Amery
Gracias, Mark. Realmente solo quería dar un ángulo alternativo. Dependiendo de quién llegue aquí, puede resultarle útil. Pero entiendo su punto de vista sobre JSON y Javascript: gracias por ser un Ninja en los foros.
Luigi D'Amico
0

Use encodeURIComponent () para codificar la cadena.

P.ej. var product_list = encodeURIComponent (JSON.stringify (product_list));

No necesita decodificarlo, ya que el servidor web automáticamente hace lo mismo.

Sanju Kaniyamattam
fuente
0

Usar literales de plantilla ...

var json = `{"1440167924916":{"id":1440167924916,"type":"text","content":"It's a test!"}}`;
Rubén
fuente
-2

Creo que todos estamos de acuerdo en que los jsons entre comillas simples no son jsons reales. Sea como fuere, todavía tenemos que abordar la cuestión de escapar "dentro de una cadena json con comillas dobles, en ausencia de bibliotecas que lo hagan por nosotros.

Reemplazar cada "con un \" NO ES SUFICIENTE: el usuario puede ingresar la entrada: \ y el análisis, nuevamente, falla (piense por qué).

En su lugar, primero reemplace cada \ con \ (barra diagonal inversa doble). Solo entonces, reemplace cada "con \" (barra invertida seguida de ").

Tom Blitz
fuente
-2

Para permitir comillas simples dentro de la cadena de comillas doble para el propósito de json, duplique la comilla simple. {"X": "¿Cuál es la pregunta"} ==> {"X": "¿Cuál es la pregunta"}

/codereview/69266/json-conversion-to-single-quotes

La secuencia \ 'no es válida.

4T2G
fuente
2
Doblar una comilla simple en una cadena JSON no se escapa. Simplemente significa que su cadena contiene dos comillas simples, en lugar de una.
Mark Amery
-15

con respecto a la publicación de AlexB:

 \'  Apostrophe or single quote
 \"  Double quote

escapar de comillas simples solo es válido en cadenas json entre comillas simples
escape de comillas dobles solo es válido en cadenas json con comillas dobles

ejemplo:

'Bart\'s car'       -> valid
'Bart says \"Hi\"'  -> invalid
Bart
fuente
14
Las cadenas entre comillas simples no son legales en JSON. JSON no es javascript. JSON no permite escapar de la comilla simple. Ver json.org para el documento muy simple de sintaxis JSON.
srm
3
voto negativo: ¡porque las comillas simples jsons no son válidas!
DominikAngerer
Las comillas simples no son válidas en json. Muestre una muestra de trabajo si esto es posible
Rohith