Escapar JSON como literal de cadena (y decodificar JSON con doble codificación)

Hacer stringify a un JSON lo envuelve en comillas y escapa las comillas internas y los caracteres especiales, produciendo un literal de cadena JSON que puedes incrustar en otros lugares.

Qué significa stringificar a un literal

Pasar una cadena JSON a JSON.stringify la envuelve en comillas dobles y escapa las comillas y barras invertidas internas, produciendo un único valor de cadena que es seguro embeber.

Por qué la necesitas

Embeber JSON dentro de otro campo JSON, guardar JSON en una columna de tipo cadena en una base de datos o pasar JSON como variable de entorno o parámetro de URL requiere un literal de cadena escapado.

Reglas de escapado

Las comillas dobles se escapan con una barra invertida, las barras invertidas se duplican y los caracteres de control como el salto de línea o el tabulador pasan a sus secuencias de escape de dos caracteres. El resultado no contiene saltos de línea reales.

Decodificar JSON doblemente codificado

Si recibes una cadena que empieza por una comilla escapada y contiene secuencias de comillas escapadas, fue stringificada. Hazle un parse una vez para recuperar la cadena JSON interna y otra para obtener el valor real.

Dónde aparece la doble codificación

Frameworks de logging que serializan objetos de contexto, payloads de webhooks que envuelven un cuerpo JSON dentro de un campo 'body', colas de mensajes que envían sobres «JSON como cadena» y columnas de bases de datos de tipo text o varchar son las fuentes más comunes. Busca una comilla inicial seguida de un número par de barras invertidas.

Trabajar con JSON embebido en logs

Los loggers estructurados suelen stringificar objetos para que cada línea sea un único valor. Para inspeccionarlo, saca la línea del visor de logs, desescápala con JSON.parse y luego formatea el JSON recuperado. Evita hacer grep sobre objetos JSON multilinea — un JSON stringificado a una sola línea es mucho más fácil de buscar.

Herramientas para el viaje de ida y vuelta

Consola del navegador: JSON.parse(line) devuelve el JSON interno y luego JSON.stringify(...,null,2) lo embellece. Node en línea de comandos: 'node -e "console.log(JSON.parse(process.argv[1]))" "<line>"' hace ambos pasos. La herramienta JSON Stringify de este sitio gestiona anidamientos arbitrariamente profundos con un clic.