Pular para o conteúdo principal

Recuperar JSON escapado

Desescapar JSON desfaz o escape de strings: transforma \" de volta em uma aspa, \n de volta em uma quebra de linha e \uXXXX de volta em seu caractere, recuperando o documento que estava embutido dentro de outro. É deliberadamente tolerante com fragmentos copiados de linhas de log, que normalmente chegam sem as aspas externas.

Só local
String escapada
0 B1 linhaLin. 1, Col. 1
Documento recuperadosomente leitura
0 B1 linha

Como funciona o Recuperar JSON escapado?

Você quase sempre chega a esta ferramenta a partir de um arquivo de log. Alguém registrou um corpo de requisição colocando o documento JSON inteiro dentro de um único campo string, e o que você está vendo é uma linha densa de \" onde deveriam estar as aspas, com \n no lugar das quebras de linha e \\ onde quer que um caminho de Windows tenha aparecido. É tecnicamente legível e praticamente não.

Desescapar é o inverso de escapar, e mecanicamente simples: percorra o texto e, cada vez que uma barra invertida aparecer, consuma o caractere depois dela e emita o que o par representa. O julgamento está inteiramente em como lidar com uma entrada imperfeita, o que ela quase sempre é.

Um parser de JSON estrito rejeitaria a maior parte do que as pessoas colam aqui. O fragmento geralmente perdeu as aspas em volta para um copiar-e-colar que selecionou só a parte interessante. Pode ter sido truncado pelo limite de comprimento de um campo de log. Pode conter uma barra invertida que não é um escape de JSON válido de forma alguma, porque o que o produziu estava escapando para outro alvo. Um parser que recusa tudo isso está correto e é inútil.

Por isso esta ferramenta é tolerante de propósito. Aspas externas faltando estão tudo bem e são reportadas em vez de exigidas. Um escape desconhecido como \q mantém os dois caracteres e gera um aviso. Uma barra invertida no final é mantida. Uma sequência \u incompleta fica como está. Em todos os casos o resto do documento ainda é recuperado, porque um payload recuperado parcialmente é muito mais útil do que uma mensagem de erro.

Unicode recebe o tratamento devido. Um escape \uXXXX vira o seu caractere, e um surrogate alto seguido de um surrogate baixo é recombinado no único caractere que os dois codificam juntos — sem esse passo, todo emoji e cada glifo CJK mais raro sai como dois quadrados de substituição.

Depois de desescapado, o resultado é verificado: se for JSON válido, recebe pretty-print, que é quase sempre o que você queria de fato. Se não for, é mostrado como texto simples com o erro de parse, para você ver se o documento foi truncado no log ou já chegou quebrado.

String escapada

"{\"name\":\"Ada\",\"note\":\"line one\nline two\"}"

Documento recuperado

{
  "name": "Ada",
  "note": "line one
line two"
}

Quais opções e casos-limite o Recuperar JSON escapado suporta?

Referência técnica e opções
ParâmetroTipoPadrãoComportamento e casos-limite
\" \\ \/escape—Aspas, barra invertida e barra. O escape da barra é legal mas opcional em JSON, então aparece na saída de alguns produtores e não de outros.
\n \r \t \b \fescape—Os caracteres de controle nomeados. \n é o que faz a diferença entre um bloco de texto e um documento legível.
\uXXXXescape—Uma unidade de código UTF-16. Um substituto alto seguido por um substituto baixo é recombinado no único caractere que ele codifica; sem isso, todo emoji e muitos caracteres CJK voltam como duas caixas quebradas.
Aspas ao redoropcionalremovidas se presentesUm fragmento colado de uma linha de log geralmente as perdeu. Se elas estavam lá é reportado em vez de exigido.
Escape desconhecidomantido + aviso—\q e similares mantêm ambos os caracteres. Um analisador estrito rejeita todo o documento; continuar recupera o resto, que é o que você veio buscar.
Substituto solitáriomantido + aviso—Um substituto alto sem metade baixa não pode formar um caractere. Ele é preservado e sinalizado, pois geralmente significa que a fonte foi truncada no meio de um caractere.
FormatarbooleanotrueRe-indenta quando o texto recuperado é JSON válido. Quando não é, o texto bruto é mostrado com o erro de análise, o que distingue um campo de log truncado de um documento que já estava quebrado.

Perguntas frequentes

Minha linha de log está com escape duplo. Executo isto duas vezes?

Sim. O escape duplo acontece quando um string já escapado é escapado de novo — um payload registrado como string, e então essa linha de log registrada como string por um agregador. Você verá \\\" onde \" deveria estar. Passe a saída de novo pela ferramenta e a segunda camada sai. Se, depois de uma passada, estiver igual, você chegou ao fundo.

Por que o resultado ainda não é um JSON válido?

Geralmente, truncamento. Campos de log têm limites de comprimento, então o documento costuma ser cortado no meio de um string ou de um objeto, e desescapá-lo fielmente produz algo que não faz parse porque de fato está incompleto. O erro de parse indica a linha e a coluna em que ele para, o que normalmente cai exatamente no ponto de truncamento.

O que aconteceu com meus emojis?

Se eles sobreviveram, o par de surrogates foi recombinado corretamente. Se uma ferramenta mostra dois quadrados em vez disso, ela decodificou cada metade \uXXXX de forma independente — caracteres fora do Plano Multilíngue Básico são codificados como duas unidades de código e precisam ser unidos. Esta ferramenta os une, e avisa quando encontra uma metade isolada, o que indica truncamento.

Posso colar um texto que não é JSON?

Sim. O desescapamento é textual, então uma instrução SQL escapada, um fragmento de HTML escapado ou um comando de shell escapado desescapa sem problema. Ele apenas vai reportar que o resultado não é JSON válido e mostrá-lo como texto simples em vez de aplicar pretty-print.

A linha de log que eu colar é enviada a algum lugar?

Não. O desescapamento roda no seu navegador. Isso importa mais aqui do que na maioria das ferramentas: as linhas de log que as pessoas desescapam são frequentemente corpos de requisição de produção contendo tokens, identificadores de sessão e registros de clientes, e colar uma em uma ferramenta do lado do servidor a copia para um segundo log de acesso.

Desescapar muda os caracteres, ou só a forma como eles são escritos?

Só a forma como são escritos. \u00e9 e é são duas grafias de um mesmo caractere, e desescapar reescreve a grafia — o que sai é exatamente o texto que a forma escapada codificava. É também por isso que a saída às vezes fica idêntica à entrada: uma linha de log em que nada está escapado não tem nada a mudar.