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.
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?
| Parâmetro | Tipo | Padrão | Comportamento 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 \f | escape | — | Os caracteres de controle nomeados. \n é o que faz a diferença entre um bloco de texto e um documento legível. |
| \uXXXX | escape | — | 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 redor | opcional | removidas se presentes | Um fragmento colado de uma linha de log geralmente as perdeu. Se elas estavam lá é reportado em vez de exigido. |
| Escape desconhecido | mantido + 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ário | mantido + 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. |
| Formatar | booleano | true | Re-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.