Formatador JSON

Embeleze JSON com dois espaços, quatro espaços ou tabulação, ou minifique em uma linha; se não for válido, você vê a linha e a coluna exatas do erro.

Indentação
Entrada
Saída

A saída aparecerá aqui

O que este formatador de JSON faz

JSON (JavaScript Object Notation) é o formato mais comum para mover dados estruturados entre programas: respostas de API, arquivos de configuração, linhas de log e mais. Foi projetado para ser compacto, o que também o torna difícil de ler quando os objetos aninham alguns níveis ou chegam em uma única linha. Esta ferramenta pega qualquer JSON que você cola e o reescreve de duas formas: embelezado, com indentação consistente para que a estrutura fique óbvia num relance, ou minificado, sem nenhum espaço opcional, para ser o menor possível ao enviar.

Ela também valida enquanto formata. Como analisa o texto antes de reserializá-lo, um JSON inválido nunca produz uma saída enganosa — em vez disso você recebe a linha e a coluna onde a análise falhou, sempre que ela consegue deduzi-las, para ir direto ao problema.

Embelezar vs. minificar: quando usar cada um

Os dois modos têm objetivos opostos, e a maioria dos fluxos de trabalho usa ambos em etapas diferentes:

  • Embeleze quando você lê ou depura: inspecionar uma resposta de API, comparar dois payloads ou revisar um arquivo de configuração em um pull request. A indentação transforma um muro de texto em uma árvore navegável.
  • Minifique quando você envia: incorporar JSON em HTML, armazená-lo em um cookie ou cache, ou mandá-lo no corpo de uma requisição onde cada byte conta. O JSON minificado é exatamente os mesmos dados, apenas sem os espaços.

O seletor de indentação (2 espaços, 4 espaços ou tabulação) só afeta a saída embelezada. Dois espaços é a convenção mais comum em JavaScript e no tooling web; quatro espaços ou tabulações servem a equipes que os preferem. Qualquer que seja a escolha, o resultado continua sendo JSON válido — a indentação é puramente cosmética.

Ler os erros de validação

Quando o JSON é inválido, a ferramenta relata a linha e a coluna do primeiro problema em vez de um simples "inválido", exceto no único caso que a seção sobre para onde apontam a linha e a coluna descreve. As mensagens de erro dos motores diferem entre navegadores e frequentemente omitem uma posição, então o local é calculado de forma independente e aponta um ponto razoável para começar. Corrija o primeiro erro e verifique de novo — um único caractere perdido muitas vezes se desdobra em vários problemas aparentes.

Erros comuns de JSON

JSON é mais rígido que os objetos literais de JavaScript com os quais se parece. Estes são os erros que mais confundem:

  • Vírgulas finais: uma vírgula após o último item de um objeto ou array é válida em JavaScript, mas não em JSON.
  • Aspas simples: as strings e chaves JSON devem usar aspas duplas. 'valor' é inválido; "valor" é correto.
  • Chaves sem aspas: toda chave de objeto deve ser uma string entre aspas, então { name: "x" } deve virar { "name": "x" }.
  • Comentários: JSON não tem sintaxe de comentário. // e /* */ causarão um erro de análise.
  • Números especiais: NaN, Infinity e -Infinity não são números JSON válidos.
  • Aspas erradas: as "aspas tipográficas" coladas de um processador de texto parecem aspas, mas são caracteres diferentes e não serão analisadas.

Para onde apontam a linha e a coluna relatadas

A posição não é onde você omitiu algo: é onde o analisador encontrou pela primeira vez algo que não pode legitimamente estar ali, e normalmente são dois lugares diferentes. No objeto abaixo, falta à linha 3 a vírgula que deveria fechá-la, e a ferramenta relata a linha 4, coluna 3: a aspa de abertura da chave seguinte. Nada estava errado até aquela aspa chegar, porque o documento poderia legitimamente ter terminado depois da linha 3; então o analisador só fica sabendo da omissão quando encontra algo que não é nem uma vírgula nem uma chave de fechamento.

{
  "id": 42,
  "name": "widget"
  "price": 9.99
}
  • Uma vírgula que falta é relatada no primeiro caractere do que vem depois, que em JSON indentado como o de cima é a linha seguinte: leia a linha indicada junto com a de cima.
  • Uma vírgula sobrando é relatada na chave ou no colchete de fechamento: linha 3, coluna 1 para um objeto cujo último par está na linha 2. A vírgula promete outro par e a chave é o que quebra a promessa.
  • Uma string não fechada costuma ser relatada no fim da linha em que ela abriu, e não na aspa de abertura, porque a próxima aspa numa linha posterior pode fechá-la em outro lugar. Uma quebra de linha não pode aparecer dentro de uma string JSON, então a quebra é o primeiro caractere que não pode estar ali.
  • Linha 1, coluna 1 em um documento que parece perfeito quase sempre significa uma marca de ordem de bytes. Alguns editores escrevem uma ao salvar como UTF-8; ela é invisível, fica antes da chave de abertura, e JSON não tem lugar para ela.

E onde a ferramenta não consegue deduzir posição alguma, ela relata a falha sem ela em vez de citar uma coordenada adivinhada. Uma linha e uma coluna ditas com segurança mas apontando para uma sintaxe perfeitamente correta fariam você procurar no lugar errado, e isso é pior do que saber apenas que o documento não é analisado.

O que a formatação muda e o que ela conserva

Para quase todo documento a resposta é o espaço em branco e mais nada. Mas a ferramenta não edita o seu texto: ela o analisa transformando-o em valores reais e escreve esses valores de novo, e cinco coisas não sobrevivem a essa ida e volta. Nenhuma delas é uma falha da ferramenta, porque cada uma é o que a especificação do JSON diz que são um número e um objeto, e vale conhecer cada uma antes de colar a saída sobre o seu original.

  • A mesma chave escrita duas vezes: só a última das duas sobrevive, porque um objeto não pode carregar uma chave duas vezes. A RFC 8259 diz que um programa que recebe um objeto com nomes duplicados se comporta de forma imprevisível, e outro analisador pode ficar com o primeiro, então qual das duas sobra também não é algo em que confiar.
  • Um inteiro com mais de quinze dígitos: os números JSON são lidos como ponto flutuante de dupla precisão, que guarda com exatidão todo número inteiro até dois elevado a cinquenta e três — um número de dezesseis dígitos — então um inteiro de quinze dígitos sempre sobrevive e um mais longo pode não sobreviver. Cole 12345678901234567890 e sai 12345678901234567000. Identificadores longos de banco de dados são a vítima habitual: mantenha-os como strings se puder.
  • As formas com expoente e com zeros finais são normalizadas: 1e3 volta como 1000, e 1.50 como 1.5. É o mesmo número escrito do jeito padrão.
  • Uma magnitude fora do que esse formato aguenta volta como outra coisa: 1e400 não tem valor em dupla precisão e volta como null, e 1e-400 volta como 0. Uma fração decimal longa é arredondada para a precisão que o formato tem, do mesmo jeito que um inteiro longo.
  • Uma sequência de escape se transforma no caractere que ela denota: \u00e9 volta como é, e um par surrogado com escape volta como o emoji que ele soletra. Para qualquer analisador são a mesma string; uma das duas escritas é simplesmente mais curta.

A ordem das chaves é conservada como você escreveu, com uma exceção que vale conhecer: uma chave feita só de dígitos, que se lê como um inteiro não negativo simples abaixo de uns quatro bilhões, é tratada como índice de array e volta para o começo do seu objeto em ordem numérica, onde quer que você a tenha posto. Mais nada se move: nenhuma outra chave é reordenada, e nenhuma é acrescentada ou renomeada. Se algo disso importa para você, minifique em vez de embelezar e compare o resultado com o seu original caractere por caractere. É o caminho mais curto para ver o que a ida e volta fez.

Quando o JSON que você quer está dentro de uma string

Registros de webhooks, filas de mensagens e colunas de banco de dados carregam muito frequentemente um documento JSON inteiro como um único valor de string, com cada aspa de dentro em escape. O documento de fora é perfeitamente válido, então a ferramenta o embeleza e o relata válido — e a parte que você veio ler continua uma longa linha de barras invertidas. Nada deu errado: são dois documentos, um embrulhado dentro de uma string do outro.

{
  "event": "order.created",
  "payload": "{\"id\":42,\"total\":19.99}"
}

Ler isso exige, portanto, duas passadas. Formate aqui o documento de fora, copie o que está entre as aspas da string que você quer, desfaça o escape e cole o resultado de volta. A ferramenta Escape / unescape de strings JSON faz esse passo do meio: a direção de unescape dela transforma \" de novo em " e a linha de novo em um documento que esta página consegue formatar. Se você controla o que produziu o arquivo, a correção melhor está mais acima: envie o payload como objeto aninhado em vez de string, e nenhuma passada é necessária.

Um objeto por linha não é um documento

Arquivos de log, exportações de API e endpoints de streaming costumam guardar um objeto JSON completo por linha; o formato se chama JSON Lines, ou NDJSON. Cada linha é JSON válido por si só, mas o arquivo não é um documento JSON, porque um documento JSON guarda exatamente um valor de nível superior e este guarda vários, um depois do outro e sem nada que os junte.

{"level":"info","msg":"started"}
{"level":"warn","msg":"retrying"}
{"level":"error","msg":"gave up"}

Cole isso aqui e a ferramenta relata a linha 2, coluna 1: o primeiro objeto terminou de forma limpa, e então um segundo começou onde o documento deveria ter acabado. Dali existem dois caminhos. Formate uma linha por vez, que é o que você quer quando está lendo uma única entrada de log. Ou transforme o arquivo em um documento — embrulhe as linhas em colchetes e ponha uma vírgula no fim de cada linha menos a última — que é o que você quer quando está a ponto de carregar tudo em algo que espera um array.

Perguntas frequentes

Meu JSON é enviado para um servidor?
Não. A análise, a validação e a formatação acontecem todas no seu navegador com JavaScript. Nada do que você cola é enviado, armazenado ou registrado, então é seguro usar com payloads sensíveis.
A formatação muda meus dados?
Para quase todo documento, não: embelezar e minificar apenas acrescentam ou removem espaço entre os tokens, e as chaves, os valores e a estrutura voltam idênticos. Há exceções, cada uma delas consequência de analisar o seu texto transformando-o em valores reais antes de escrevê-lo de novo, e a seção sobre o que a formatação muda lista todas elas.
Por que ele reordena ou reformata meus números?
A ferramenta analisa o JSON transformando-o em valores reais e os serializa de volta, então os números são normalizados para a forma canônica (por exemplo 1e3 se torna 1000). Para qualquer número que o ponto flutuante de dupla precisão guarda com exatidão, o valor não muda e só a escrita dele é padrão. Para um número que pede mais precisão ou mais alcance do que esse formato tem — um inteiro além de quinze dígitos, uma fração decimal longa, ou uma magnitude totalmente fora dele — o próprio valor se move, e a seção sobre o que a formatação muda diz como.
Ele consegue lidar com arquivos JSON muito grandes?
Ele lida com payloads grandes, mas como tudo roda no navegador, arquivos extremamente grandes (dezenas de megabytes) podem ficar lentos ou atingir limites de memória dependendo do seu dispositivo.
Ele preserva a ordem das chaves do objeto?
Quase sempre sim: a ordem das chaves é conservada exatamente como aparece na sua entrada, e a ferramenta não ordena nada por conta própria. A única exceção é uma chave feita só de dígitos que se lê como um inteiro não negativo simples abaixo de uns quatro bilhões — essa é tratada como índice de array e volta para o começo do seu objeto em ordem numérica. O JSON chama um objeto de coleção sem ordem, então nada quebra, mas surpreende; a seção sobre o que a formatação muda carrega o detalhe.
Qual é a diferença entre JSON e um objeto JavaScript?
JSON é um formato de texto para troca de dados; um objeto JavaScript é um valor na memória. JSON é mais rígido: exige chaves e strings entre aspas duplas, proíbe vírgulas finais e comentários, e só admite um conjunto fixo de tipos de valor (strings, números, booleanos, null, arrays e objetos).
Posso formatar JSON5 ou JSONC (JSON com comentários)?
Não. Esta ferramenta valida JSON estrito e padrão. JSON5 e JSONC adicionam comentários e outras conveniências que não fazem parte da especificação do JSON, então serão reportados como erros.
Uma string ou um número são JSON válido sozinhos?
Sim. Um documento JSON é qualquer valor único, então "olá", 42, true e null são cada um completo e válido, e esta ferramenta formata os quatro. Não foi sempre assim: a RFC 4627 (2006) exigia um objeto ou um array no nível superior, a RFC 7159 afrouxou isso em 2014, e a RFC 8259 carrega hoje a regra mais solta. O que recusa um valor sozinho está seguindo a especificação antiga.
Posso formatar JSON Lines ou NDJSON aqui?
Uma linha por vez, sim: cada linha é um documento JSON completo. O arquivo inteiro de uma vez, não: são vários documentos em vez de um, e a ferramenta relata a linha 2, coluna 1, onde o segundo começa. A seção acima sobre um objeto por linha cobre as duas saídas.
Por que ela relata a linha 1, coluna 1 em um documento que parece correto?
Quase sempre por um caractere invisível antes da chave de abertura, e quase sempre por uma marca de ordem de bytes deixada por um editor que salvou como UTF-8. É um caractere real, ele não pode ser visto, e JSON não tem lugar para ele. Salve o arquivo de novo como UTF-8 sem marca de ordem de bytes, ou apague o primeiro caractere e cole outra vez.
A formatação descarta uma chave duplicada?
Sim, e é o único caso em que a saída guarda menos do que a entrada. Uma chave escrita duas vezes no mesmo objeto deixa só a última das duas, porque a ferramenta analisa o seu texto transformando-o em valores reais e um objeto não pode carregar uma chave duas vezes. Qual das duas sobrevive também não é portátil: a RFC 8259 diz que um programa que recebe um objeto assim se comporta de forma imprevisível, e outro analisador pode ficar com a primeira.

Ferramentas relacionadas