Escape / unescape de strings JSON

Faça escape de texto para que seja válido dentro de uma string JSON, ou descodifique texto com escape para o que ele diz — com posições de erro exatas.

Texto
Com escape

A saída aparecerá aqui

O que esta ferramenta faz

Uma string JSON não pode conter aspas duplas em bruto, uma barra invertida em bruto nem uma quebra de linha literal: o formato precisa desses caracteres para marcar onde as strings começam e acabam. Por isso são escritos como sequências de escape, e esta ferramenta converte entre as duas formas. Cole texto normal e obtenha a versão com escape, pronta a inserir em JSON; troque de sentido e o texto com escape volta a ser legível.

É o segundo sentido que costuma trazer as pessoas aqui: uma linha de registo, uma mensagem de erro ou uma resposta de curl que chegou como um muro de barras invertidas. Tudo corre no seu navegador, o que importa quando aquilo que está a tentar ler é uma resposta de produção.

As sequências de escape

O JSON define uma lista curta de escapes, e a ferramenta usa exatamente essa lista — nada mais exótico, porque tudo o resto não é JSON válido.

  • \" — aspas duplas, que de outra forma terminariam a string.
  • \\ — uma única barra invertida. É por isso que os caminhos do Windows e os padrões de expressões regulares duplicam.
  • \n e \r — quebra de linha e retorno de carro.
  • \t — tabulação. Também existem \b e \f, para retrocesso e avanço de página.
  • \/ — um escape opcional para a barra. Válido, nunca obrigatório; esta ferramenta aceita-o e nunca o produz.
  • \uXXXX — qualquer caractere pelo seu código hexadecimal, que é como se escrevem os caracteres de controlo e tudo o que esteja fora do ASCII.

Os caracteres de controlo — tudo abaixo do código 32 — não têm qualquer forma literal dentro de uma string JSON, por isso saem sempre como escapes \uXXXX, mesmo que não tenha pedido saída ASCII.

Porque é que as barras invertidas se multiplicam

A razão mais comum para recorrer a uma ferramenta destas é texto que sofreu escape mais do que uma vez. Cada ronda de codificação faz escape às barras invertidas introduzidas pela anterior, por isso umas simples aspas acabam com uma cauda cada vez mais longa:

original    He said "hi"
escaped     He said \"hi\"
escaped x2  He said \\\"hi\\\"

Isto acontece quando um valor é serializado para JSON, esse JSON é guardado como string dentro de outro documento JSON, e o resultado vai para os registos. Descodificar uma vez desfaz uma camada; volte a correr sobre o resultado até o texto se ler normalmente. Se descodificar e a saída ainda tiver barras soltas, é mesmo uma camada extra, não uma falha da conversão.

Aspas: valor ou fragmento

Um valor string JSON completo inclui as aspas duplas envolventes. Mas na maior parte das vezes está a colar dentro de uma string que já existe no seu código ou configuração, onde essas aspas estariam a mais. Por isso o escape produz por omissão apenas o conteúdo com escape, e a opção «incluir aspas envolventes» acrescenta-as quando quer um valor para colar inteiro.

A descodificação não precisa dessa escolha — aceita as duas formas. Cole um fragmento ou cole um valor entre aspas completo tirado diretamente de um documento JSON, e as aspas envolventes são reconhecidas e removidas.

Unicode, e quando lhe fazer escape mesmo assim

O JSON é um formato Unicode. «שלום» e «😀» são strings JSON perfeitamente válidas tal como estão escritas, e deixá-las legíveis é o comportamento por omissão aqui. A opção \uXXXX existe para os sistemas que ficaram para trás: pipelines de registos antigos, terminais e analisadores que assumem ASCII e estragam tudo o resto.

Há um detalhe que conta quando essa opção está ligada. Os caracteres fora do intervalo básico — a maioria dos emoji — são guardados internamente como duas unidades a que se chama par substituto, e o formato exige que ambas as metades sejam escritas como escapes separados. Um emoji passa então a dois escapes \u e não a um mais longo. As ferramentas que erram nisto produzem escapes que nenhum analisador aceita, o que costuma explicar os emoji que sobrevivem a um sistema e se partem no seguinte.

Quando a descodificação falha

Nem toda a sequência com barra invertida é um escape válido. \q não significa nada em JSON, e \u12 é um escape \u a que falta metade dos dígitos. Em vez de os deixar passar inalterados e devolver uma saída que parece certa mas não é o que os seus dados diziam, a ferramenta para e indica a linha e a coluna exatas onde a sequência defeituosa começa.

Na prática esse erro é informativo: um \q solto costuma significar que o texto nunca sofreu escape para JSON, e um \u truncado costuma significar que a entrada foi cortada — uma linha de registo aparada por um limite de comprimento, ou uma cópia que parou a meio da sequência.

Perguntas frequentes

Porque é que o meu texto tem \\" por todo o lado?
Sofreu escape mais do que uma vez. Cada passagem faz escape às barras invertidas da anterior, por isso umas aspas originais podem acabar precedidas por várias. Descodifique repetidamente — cada execução remove exatamente uma camada — até o texto se ler normalmente.
Devo ativar as aspas envolventes?
Só se quiser um valor JSON completo para colar tal como está, por exemplo como todo o lado direito de uma chave. Se estiver a colar dentro de uma string que já existe no seu código, deixe desligado; caso contrário ficará com aspas dentro de aspas.
É preciso fazer escape a hebraico, árabe, chinês ou emoji?
Não. As strings JSON são Unicode, por isso esses caracteres são válidos tal como estão e continuam legíveis por omissão. Ative a opção \uXXXX apenas quando um sistema a jusante insistir em ASCII puro; os emoji passam então a ser escritos como os seus dois escapes substitutos obrigatórios.
O que significa «sequência de escape inválida»?
A entrada contém uma barra invertida seguida de algo que o JSON não define, como \q, ou um \u sem quatro dígitos hexadecimais a seguir. A posição é indicada para poder olhar exatamente para esse ponto: normalmente o texto não tinha sofrido escape para JSON, ou foi truncado a meio.
O meu texto é enviado para algum lado?
Não. Tanto o escape como a descodificação correm inteiramente no seu navegador, por isso tokens, payloads e linhas de registo nunca saem do seu dispositivo.