Escapar JSON como literal de string (e decodificar JSON com codificação dupla)

Fazer stringify de JSON o envolve em aspas e faz escape das aspas internas e dos caracteres especiais, produzindo um literal de string JSON pronto para ser embutido em outro lugar.

O que significa «stringificar para um literal»

Passar uma string JSON por JSON.stringify a envolve em aspas duplas e escapa as aspas internas e as barras invertidas, produzindo um único valor de string seguro para embutir.

Por que você precisa disso

Embutir JSON dentro de outro campo JSON, guardar JSON em uma coluna de tipo string em um banco, ou passar JSON via variável de ambiente ou parâmetro de URL exige um literal de string escapado.

Regras de escape

As aspas duplas são escapadas com uma barra invertida, as barras invertidas são duplicadas, e caracteres de controle como quebra de linha e tab viram suas sequências de escape de dois caracteres. O resultado não contém quebras de linha cruas.

Decodificar JSON com codificação dupla

Se você receber uma string que começa com uma aspa escapada e contém sequências de aspas escapadas, ela foi stringificada. Parseie uma vez para recuperar a string JSON interna, depois parseie de novo para obter o valor real.

Onde a codificação dupla aparece

Frameworks de logging que serializam objetos de contexto, payloads de webhook que envolvem um corpo JSON em um campo 'body', filas de mensagens que enviam «envelopes JSON-como-string», e colunas de banco do tipo text ou varchar são as fontes mais comuns. Procure uma aspa inicial seguida de um número par de barras invertidas.

Trabalhando com JSON embutido em logs

Loggers estruturados geralmente stringificam objetos para manter cada linha como um único valor. Para inspecionar, tire a linha do visualizador de logs, desescape com JSON.parse e então formate o JSON recuperado. Evite dar grep em um objeto JSON multilinha — JSON stringificado em uma linha é muito mais fácil de buscar.

Ferramentas para o round-trip

Console do navegador: JSON.parse(line) devolve o JSON interno e JSON.stringify(...,null,2) imprime bonitinho. Node CLI: 'node -e "console.log(JSON.parse(process.argv[1]))" "<line>"' faz os dois passos. A ferramenta JSON Stringify deste site lida com aninhamento de qualquer profundidade em um clique.