Pular para o conteúdo principal

Deixar JSON legível

Esta ferramenta formata JSON com indentação e quebras de linha para que uma pessoa consiga ler. Cole um documento abaixo para fazer isso aqui, ou pegue a única linha que faz isso na linguagem que você usa — JavaScript, Python, Go, Java, C#, PHP, Ruby, Rust, jq ou PowerShell — cada uma com o padrão que pega as pessoas de surpresa, porque todas essas APIs têm um.

Só local
Recuo
JSON
0 B1 linhaLin. 1, Col. 1
Formatadosomente leitura
0 B1 linha
Na sua linguagem

Nativo. Sem dependências, no navegador e no Node.

JavaScript — formataçãosomente leitura
225 B7 linhas
O padrão que costuma surpreender O segundo argumento é o replacer, não o recuo. Use JSON.stringify(value, null, 2). undefined, funções e símbolos podem desaparecer; BigInt causa TypeError.

Como funciona o Deixar JSON legível?

Formatar JSON de forma legível (pretty-print) significa uma coisa: analisar o documento e reescrevê-lo com uma quebra de linha depois de cada vírgula e um nível de indentação por nível de aninhamento. Os bytes são equivalentes — um parser não distingue um do outro — mas um é legível e o outro é um muro.

Duas perguntas diferentes, uma página

Quem busca isso quer uma de duas coisas: ou uma caixa onde colar a carga, que é o painel acima; ou a linha de código que faz isso dentro de um programa que está escrevendo, que é o seletor logo abaixo dele. Esta página responde às duas, porque ser mandado para um widget de formatação quando você precisava de json.dumps(obj, indent=2) é um clique desperdiçado.

Toda linguagem tem um padrão que surpreende alguém

Essa é a parte que vale a pena conhecer, e é por isso que cada receita aqui traz uma nota própria, em vez de ser uma lista de linhas de código. Python escapa todos os caracteres não ASCII a menos que você passe ensure_ascii=False, então café chega como caf\u00e9. Go escapa <, > e & porque a saída pode já ter ido para uma tag <script>. PHP escapa barras normais, então toda URL na sua saída parece quebrada. O ConvertTo-Json do PowerShell trunca qualquer coisa aninhada mais de dois níveis e não avisa — simplesmente substitui o resto por um nome de tipo e segue em frente.

E em JavaScript, o erro está na própria chamada: JSON.stringify(value, 2) parece certo, compila, roda e retorna a string minificada, porque o segundo argumento é a função replacer e o terceiro é a indentação.

Ordenar as chaves é uma decisão à parte

Ordenar as chaves alfabeticamente torna duas versões do mesmo documento comparáveis por diff, e esse é o único motivo para fazer isso — sem isso, um serializador que emite chaves na ordem de inserção gera um diff cheio de movimentações. Aqui isso vem desligado por padrão, porque muda a ordem do documento, e em um arquivo de configuração ou um lockfile essa ordem às vezes tem significado.

Indentação, e o que escolher

Dois espaços é a convenção da web e do JavaScript e mantém documentos profundamente aninhados visíveis na tela. Quatro é a norma em Python e em boa parte do mundo backend. Tabulações deixam cada leitor escolher a própria largura, o que é o argumento mais forte a favor delas e o motivo de alguns projetos insistarem nelas. Nenhuma das três opções é mais correta que as outras; a única resposta errada é misturá-las dentro de um mesmo arquivo.

Isso não muda o que os dados significam

O espaço em branco entre tokens não é significativo no JSON, então a formatação legível é reversível e sem perdas — passe a saída por um minificador e você recebe a entrada de volta, byte a byte, a menos que também tenha ordenado as chaves. O que muda é o tamanho: a indentação pode acrescentar de 20 a 40% a um documento, o que importa na rede e não importa em nada em um log que você está lendo.

Se o documento não analisa, nada aqui consegue formatá-lo, e o erro abaixo indica a linha e a coluna. O validador de JSON também vai se oferecer para reparar as causas comuns — uma vírgula sobrando, uma aspa simples, uma chave sem aspas.

Nada é enviado

A análise e a re-serialização acontecem nesta aba, em JavaScript que já está carregado. As cargas que as pessoas formatam são respostas de API e linhas de log, que rotineiramente contêm tokens e registros de clientes, e a Content-Security-Policy da página define connect-src 'self' — então o navegador bloquearia um envio, em vez de apenas não tentar fazer um.

Minificado

{"id":42,"tags":["prod","payment"],"ok":true}

Formatado

{
  "id": 42,
  "tags": [
    "prod",
    "payment"
  ],
  "ok": true
}

Quais opções e casos-limite o Deixar JSON legível suporta?

Referência técnica e opções
ParâmetroTipoPadrãoComportamento e casos-limite
JavaScriptJSON.stringifyintegradoJSON.stringify(valor, null, 2). O segundo argumento é o substituto — passar 2 ali não faz absolutamente nada.
Pythonjson.dumpsbiblioteca padrãojson.dumps(obj, indent=2). Adicione ensure_ascii=False ou cada caractere não-ASCII será escapado.
jqshell—jq . arquivo.json, e jq -S . para ordenar chaves. Antes do jq 1.7, inteiros grandes eram alterados silenciosamente.
Linha de comandopython3 -m json.tool—Presente na maioria das máquinas, com --indent, --sort-keys e --no-ensure-ascii.
Goencoding/jsonbiblioteca padrãojson.MarshalIndent para um valor, json.Indent para bytes que você já tem. Ambos escapam os colchetes angulares.
JavaJackson—writerWithDefaultPrettyPrinter(). O padrão imprime arrays em uma linha até você definir um indentador de array.
C#System.Text.Json.NET Core 3+JsonSerializerOptions { WriteIndented = true }. Escapa muito mais do que a especificação requer.
PHPjson_encodeintegradoJSON_PRETTY_PRINT, mais JSON_UNESCAPED_SLASHES e JSON_UNESCAPED_UNICODE, que você quase sempre quer.
RubyJSON.pretty_generatebiblioteca padrãoNão é o mesmo que to_json, que permanece compacto.
Rustserde_json—to_string_pretty. O valor ordena chaves a menos que o recurso preserve_order esteja ativado.
PowerShellConvertTo-JsonintegradoO padrão é -Depth 2 e trunca silenciosamente abaixo disso. Sempre passe -Depth explicitamente.

Perguntas frequentes

Como formatar JSON de forma legível em JavaScript?

JSON.stringify(value, null, 2). Os três argumentos são o valor, um replacer e a indentação — então o erro que todo mundo comete uma vez é JSON.stringify(value, 2), que coloca o 2 na posição do replacer, não faz nada e retorna a string minificada. Passe "\t" em vez de 2 para tabulações. Fique atento ao que o stringify descarta em silêncio pelo caminho: valores undefined e funções desaparecem de objetos e viram null dentro de arrays, um Map ou Set vira {}, e um BigInt lança exceção.

Como formatar JSON de forma legível em Python?

json.dumps(obj, indent=2). O padrão que pega as pessoas é ensure_ascii=True, que escapa todo caractere não ASCII — "café" sai como "caf\u00e9", válido e ilegível. Passe ensure_ascii=False para manter UTF-8 e, ao fazer isso, abra qualquer arquivo de saída com encoding="utf-8". sort_keys=True ordena as chaves alfabeticamente, o que torna duas saídas comparáveis por diff.

Como formatar JSON de forma legível pela linha de comando?

jq . file.json se o jq estiver instalado; python3 -m json.tool file.json se não estiver, o que cobre quase toda máquina que tenha Python. O jq acrescenta ordenação com -S, indentação configurável com --indent e compactação com -c. Uma advertência: até o jq 1.6, números eram interpretados como doubles, então um ID de 64 bits podia voltar silenciosamente alterado — o jq 1.7 preserva literais numéricos não modificados, então confira a versão antes de passar identificadores por ele.

JSON formatado de forma legível ainda é JSON válido?

Sim. O espaço em branco entre tokens não tem significado no JSON, então um documento indentado e um minificado resultam exatamente no mesmo valor — a RFC 8259 permite espaço, tabulação, quebra de linha e carriage return em qualquer lugar entre tokens estruturais. A única diferença é o tamanho: a indentação costuma acrescentar de 20 a 40%, o que vale a pena remover antes de enviar uma carga pela rede e vale a pena manter em qualquer coisa que uma pessoa vá ler.

Qual a diferença entre pretty print, format e beautify?

Nenhuma, como verbos — todas significam adicionar espaço em branco para que a estrutura fique visível. As três páginas daqui diferem no que fazem além disso. Esta emparelha o formatador com o código para fazer isso em cada linguagem. O formatador de JSON tem o conjunto completo de opções: remoção de comentários JSONC, ordenação de chaves, escape de Unicode. O embelezador de JSON mira o trabalho específico de transformar um blob minificado de volta em algo legível. Escolha a que corresponder ao que você veio fazer.

Por que minha saída formatada tem escapes \u?

Porque o serializador escapou os caracteres não ASCII, e vários fazem isso por padrão. O json.dumps do Python tem ensure_ascii=True; o System.Text.Json do C# escapa tudo o que seu codificador HTML-safe desaprova; o PHP escapa não ASCII a menos que você diga o contrário. Tudo isso é JSON válido e nada disso é legível. A correção é um argumento em cada caso — ensure_ascii=False, UnsafeRelaxedJsonEscaping, JSON_UNESCAPED_UNICODE — e o seletor acima mostra isso para a linguagem em que você estiver.

Meu JSON é enviado a algum servidor?

Não. A análise e a re-serialização acontecem nesta aba, em JavaScript já carregado na página, e não há nenhum endpoint do outro lado para onde enviar coisa alguma. Isso importa aqui mais do que pode parecer: os documentos que as pessoas formatam são respostas de API e linhas de log, que rotineiramente carregam tokens, identificadores de sessão e registros de clientes. A página é servida com connect-src 'self', então o próprio navegador bloqueia qualquer requisição a outra origem.