Ferramentas
Guias

Escape / unescape de strings JSON

JSON

Escapa e desescapa strings JSON — aspas, caracteres de controle e \uXXXX.

100% no cliente Sem backend
Entrada
Saída
Nesta página

O que é o escape de strings JSON?#

Dentro de um documento JSON, uma string tem de ficar entre aspas duplas — e isso cria um problema no momento em que o próprio texto contém uma aspa, uma mudança de linha ou uma barra invertida. Se os colocasse à bruta, o parser veria a aspa de fecho demasiado cedo, ou trataria \ como o início de um escape que não compreende. Fazer escape é o ato de substituir esses caracteres pelas sequências curtas de barra invertida que a especificação JSON define: \" para uma aspa, \\ para uma barra invertida, \n para uma mudança de linha, \t para uma tabulação, entre mais algumas. Desfazer escape é o inverso — transformar essas sequências de volta nos caracteres originais.

Existe um segundo modo, mais agressivo. Alguns sistemas antigos — log shippers mais velhos, bases de dados restritivas, camadas de transporte que assumem ASCII puro — engasgam com qualquer byte acima de 127. Para esses, o JSON também permite escrever qualquer carácter não-ASCII como \uXXXX (e caracteres astrais como os emojis como um par de substitutos UTF-16). O texto continua a ser JSON válido; só acontece que, depois do escape, é composto inteiramente por ASCII.

Esta página faz ambas as direções e ambos os modos: faz escape de uma string em bruto para um literal de string JSON válido, ou desfaz o escape de um literal de volta ao texto original — com um interruptor opcional Somente ASCII que força todos os pontos de código não-ASCII para a forma \uXXXX.

Como usar#

  1. Escolha a direção com o interruptor Codificar / Decodificar no canto superior esquerdo da barra de ferramentas. Codificar faz escape de texto em bruto para um literal JSON; Decodificar desfaz o escape de um literal de volta para texto.
  2. Escreva ou cole no painel Entrada à esquerda.
    • Em Codificar, todo o texto torna-se um literal de string JSON (incluindo as aspas envolventes).
    • Em Decodificar, pode colar tanto um literal com aspas ("a\nb") como apenas o corpo escapado, sem aspas (a\nb) — a ferramenta envolve-o em aspas por si. Um número, booleano ou objeto JSON válido é rejeitado como “não é uma string” em vez de ser silenciosamente coercioado.
  3. Marque Saída somente ASCII (\uXXXX) (modo Codificar) quando o consumidor a jusante não consegue lidar com bytes não-ASCII. Caracteres astrais como os emojis são emitidos como um par de substitutos próprio, exatamente como JSON.stringify faria.
  4. O resultado aparece em tempo real no painel Saída. Clique em Copiar para o recolher.
  5. Exemplo insere uma string de demonstração em vários idiomas; Limpar repõe ambos os painéis.

Principais funcionalidades#

  • Formas curtas exatas conforme a especificação. Usa precisamente as sequências exigidas pelo RFC 8259 (\", \\, \b, \f, \n, \r, \t) e \uXXXX para todo o resto abaixo de 0x20 — correspondendo a JSON.stringify byte a byte.
  • Modo somente ASCII real. Os caracteres não-ASCII não são silenciosamente removidos nem corrompidos em mojibake; cada um é emitido como \uXXXX, e os caracteres astrais (acima de U+FFFF) tornam-se um par de substitutos UTF-16 correto, não uma unidade de código solitária e partida que os decodificadores rejeitam.
  • Desfazer escape tolerante. Aceita tanto um literal totalmente com aspas como um corpo escapado sem aspas, pelo que fragmentos colados a meio de uma linha de registro continuam a decodificar em vez de lançarem erros.
  • Recusa adivinhar. Se a entrada decodificada é JSON válido mas não uma string (por exemplo um número solto ou um array), a ferramenta diz-lho em vez de a transformar em string às escondidas.

Exemplo prático#

Carregue em Exemplo no modo Codificar e a entrada é uma string que mistura deliberadamente aspas, um caminho com barras invertidas, uma mudança de linha, um sinal de copyright, um emoji e chinês:

He said "hi"
\path\ © 🌍 你好

Sem Somente ASCII, o literal escapado mantém os caracteres legíveis de forma literal e apenas coloca entre aspas o que tem de estar:

"He said \"hi\"\n\\path\\ © 🌍 你好"

Agora marque Saída somente ASCII (\uXXXX) e a mesma entrada torna-se ASCII puro — o sinal de copyright colapsa para a forma de quatro caracteres \u00a9, o emoji do globo para o par de substitutos \ud83c\udf0d, e cada carácter chinês para o seu próprio ponto de código (\u4f60, \u597d):

"He said \"hi\"\n\\path\\ \u00a9 \ud83c\udf0d \u4f60\u597d"

Mude para Decodificar e cole qualquer um desses literais de volta: o texto original — incluindo o emoji e o chinês — é restaurado exatamente.

FAQ#

Porque é que o emoji se transforma em dois códigos \u em vez de um?#

Caracteres acima de U+FFFF (emojis, extensões raras de CJK, alguns símbolos matemáticos) não cabem numa única unidade de código de 16 bits, pelo que o UTF-16 os representa como um par de substitutos — um substituto alto seguido de um substituto baixo. O emoji do globo 🌍 (U+1F30D) torna-se \ud83c\udf0d. Emitir apenas um \u produziria JSON inválido que os decodificadores estritos rejeitam; esta ferramenta emite o par exatamente como JSON.stringify faz, pelo que o resultado faz a viagem completa (round-trip).

A decodificação diz “A entrada não é uma string JSON.” O que é que colei?#

Colou algo que é JSON válido mas não uma string — tipicamente um número solto (42), um booleano (true) ou um objeto/array. A ferramenta recusa transformá-lo em string porque isso esconderia um erro real (quase de certeza que queria colar o valor da string, não o documento inteiro). Coloque o texto entre aspas e tente de novo.

Isto lida com caracteres de controlo como uma tabulação literal ou um aviso (bell)?#

Sim. Uma tabulação literal na entrada se torna \t, um backspace \b, um form feed \f, um carriage return \r; qualquer outro código de controlo abaixo de U+0020 (incluindo o bell, 0x07) torna-se um código no estilo \u0007. Isso importa porque os caracteres de controlo em bruto são ilegais dentro de strings JSON e alguns parsers rejeitam-nos frontalmente.

A saída somente ASCII é “mais segura”?#

Apenas para um tipo específico de segurança: sobreviver a uma camada de transporte que corrompe ou rejeita bytes não-ASCII. Não é uma medida de segurança — os dados continuam a ser totalmente reversíveis, apenas expressos num alfabeto mais restritivo. Use quando um consumidor exige ASCII; deixe desativado nos restantes casos, já que a forma legível é muito mais fácil de depurar.