Cómo escapar de las comillas dobles en JSON

306

Estoy tratando de mostrar comillas dobles pero muestra una de las barras invertidas:

"maingame": {
    "day1": {
        "text1": "Tag 1",
        "text2": "Heute startet unsere Rundreise \\\"Example text\\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
    }
}

Al renderizar en el html se muestra como \"Example text\". ¿Cuál es la manera correcta?

usuario1937021
fuente

Respuestas:

446

Prueba esto:

"maingame": {
  "day1": {
    "text1": "Tag 1",
     "text2": "Heute startet unsere Rundreise \" Example text\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
  }
}

(solo una barra invertida ( \) delante de las comillas).

kamituel
fuente
99
@DWGuru esto no tiene nada que ver con los comentarios, es una secuencia de escape como se describe en ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf (Par. 9 - Strings) donde dice: All characters may be placed within the quotation marks except for the characters that must be escapedy luego especifica:\" represents the quotation mark character (U+0022)
mastazi
Por alguna razón, esto no funciona con JSON.parse () en JS.
SacWebDeveloper
32

Cuándo y dónde usar \\\"en su lugar. De acuerdo, si eres como yo, te sentirás tan tonto como yo cuando me di cuenta de lo que estaba haciendo después de encontrar este hilo.

Si está creando un archivo / secuencia de texto .json e importando los datos desde allí, entonces la respuesta de la secuencia principal de solo una barra invertida antes de las comillas dobles: \"es la que está buscando.

Sin embargo, si eres como yo y estás intentando que el "Editor Tryit" de w3schools.com tenga comillas dobles en la salida del JSON.parse (texto), entonces la que estás buscando es la triple barra invertida comillas dobles \\\". Esto se debe a que usted está construyendo su cadena de texto dentro de un archivo HTML <script>de bloques, y las primeras inserciones dobles de barra invertida una sola barra invertida en la variable de cadena a continuación, la siguiente cita doble barra invertida inserta las comillas en la cadena para que la cadena guión resultante contiene la \"de la respuesta estándar y el analizador JSON analizarán esto solo como comillas dobles.

<script>
  var text="{";
  text += '"quip":"\\\"If nobody is listening, then you\'re likely talking to the wrong audience.\\\""';
  text += "}";
  var obj=JSON.parse(text);
</script>

+1: dado que es una cadena de texto de JavaScript, una comilla doble de doble barra invertida \\"también funcionaría; porque la comilla doble no necesita escapar dentro de una sola cadena citada, por ejemplo, '\"'y da como '"'resultado la misma cadena JS

Gregor y
fuente
Esta solución ayuda en una versión de Swift a construir una cadena que se agrega a los argumentos para un JSON POST.
Nick N
18

Muestra la barra invertida porque también estás escapando de la barra invertida.

Además de las comillas dobles, también debe escapar de las barras diagonales inversas si desea incluir una en la cadena entre comillas JSON. Sin embargo, si tiene la intención de utilizar una barra diagonal inversa en una secuencia de escape, obviamente no debe escapar de ella.

Alex Worden
fuente
9

Tenga en cuenta que esto ocurre con mayor frecuencia cuando el contenido ha sido "doble codificado", lo que significa que el algoritmo de codificación se ha llamado accidentalmente dos veces.

La primera llamada codificaría el valor "text2":

DE: Heute startet unsere Rundreise "Ejemplo de texto". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

TO: Heute startet unsere Rundreise \ "Texto de ejemplo \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Una segunda codificación luego la convierte nuevamente, escapando de los caracteres ya escapados:

DE: Heute startet unsere Rundreise \ "Texto de ejemplo \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

TO: Heute startet unsere Rundreise \\\ "Texto de ejemplo \\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Entonces, si usted es responsable de la implementación del servidor aquí, verifique que no haya dos pasos para codificar el mismo contenido.

Ben
fuente
66
Creo que el codificador también escaparía del interruptor de escape, así que creo que su segundo TO: debería leer: "Heute startet unsere Rundreise \\\" Texto de ejemplo \\\ ". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.
Jonathan Mee
1
@ Jonathan Mee: Acabo de editar la respuesta de acuerdo a su sugerencia. Teóricamente se escribió correctamente con 3 barras diagonales inversas, pero stackoverflow también utiliza barras diagonales inversas para citar y convirtió las primeras dos barras diagonales inversas en una sola barra diagonal inversa
huha
5

si quiere escapar de la comilla doble en JSON, use \\ para escapar de ella.

ejemplo si quieres crear json del siguiente objeto javascript

{time: '7 "o" clock'}

entonces debes escribir de la siguiente manera

'{"time":"7 \\"o\\" clock"}'

si lo analizamos usando JSON.parse()

JSON.parse('{"time":"7 \\"o\\" clock"}')

el resultado será

{time: "7 "o" clock"}
manas
fuente
1

Para escapar de las barras invertidas que causan problemas para los datos JSON, uso esta función.

//escape backslash to avoid errors
var escapeJSON = function(str) {
    return str.replace(/\\/g,'\\');
};
mbokil
fuente
66
Animaría a los programadores a codificar el contenido, en lugar de eliminar (o "limpiar") el contenido. Solía ​​existir la idea de "limpiar" los datos de la base de datos, especialmente la eliminación de comillas simples ('). Los programadores no se dieron cuenta de que las personas no podían usar su propio apellido (O'Doul). Espero que los programadores de hoy en día usen otros medios para obtener el contenido original en la base de datos sin eliminar ni limpiar los datos.
DanBaker
Ok, eliminé la parte de desnudo del personaje para apaciguar a las masas. @DanBaker tenga en cuenta que eliminar el texto de los caracteres podría ser la única forma de hacer que JS sea seguro en una aplicación cliente. Angular desinfecta la salida HTML por este motivo de forma predeterminada.
mbokil
Estoy de acuerdo al 100% en que hay veces que los datos deben desinfectarse ... y XSS es uno de esos momentos. Gracias por señalar eso.
DanBaker
0

Para aquellos que deseen utilizar el desarrollador powershell. Aquí están las líneas para agregar a su settings.json:

"terminal.integrated.automationShell.windows": "C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
"terminal.integrated.shellArgs.windows": [
    "-noe",
    "-c",
    " &{Import-Module 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll'; Enter-VsDevShell b7c50c8d} ",
    ],
erikeah
fuente