Formatador e validador de JSON
Formate, valide e inspecione JSON — com um erro que aponta para o caractere exato.
{
"name": "jaguar",
"speed_kph": 80,
"habitats": [
"rainforest",
"wetland"
],
"conservation": {
"status": "Near Threatened",
"assessed": 2016
},
"nocturnal": null
}JSON válido
- Tamanho
- 145 B
- Minificado
- 145 B
- Poupado
- 0%
- Chaves
- 7
- Objetos
- 2
- Profundidade máxima
- 3
Os quatro erros
Quase todos os documentos recusados falham por um do mesmo punhado de motivos, e os quatro são coisas que o JavaScript teria aceitado. É essa a armadilha: o JSON parece um literal de objecto de JavaScript e é um subconjunto bastante mais estrito dele.
| Escrito | Problema | Correcto |
|---|---|---|
{"a": 1,} | Vírgula a mais no fim | {"a": 1} |
{'a': 1} | Plicas | {"a": 1} |
{a: 1} | Chave sem aspas | {"a": 1} |
{"a": 1} // note | Comentário | Remova-o |
Mais dois, que apanham menos gente mas são mais difíceis de ver. NaN, Infinity e undefined são valores válidos em JavaScript e nenhum deles é um valor de JSON — a substituição é null ou uma cadeia de texto. E uma mudança de linha literal dentro de uma cadeia é inválida; ali têm de estar os dois caracteres \n.
Como este validador reporta erros
Vale a pena explicar, porque é a razão para preferir um formatador a outro. O JSON.parse do próprio navegador é usado para o caminho de sucesso, mas não para descrever falhas: o formato das suas mensagens é um detalhe de implementação que mudou duas vezes em versões recentes do V8. O mesmo documento partido reporta «Unexpected end of JSON input» numa versão do Node e «Expected ‘,’ or ‘}’ after property value at position 6» noutra, e às vezes não dá posição nenhuma.
Por isso, quando a análise falha, esta página percorre ela própria a gramática e indica a linha, a coluna e o carácter em que parou, com um sinal por baixo. A mensagem que recebe não depende do navegador que calhou estar a usar.
O problema de precisão de que ninguém o avisa
Este provoca defeitos a sério e quase nunca é mencionado. Os números de JSON passam a números de JavaScript, e os números de JavaScript são duplos IEEE 754. Inteiros acima de 2⁵³ — cerca de 9,007 mil biliões — não podem ser representados exactamente.
Um identificador de 19 dígitos do género dos que o Twitter, o Discord e a maioria dos esquemas ao estilo Snowflake produzem volta alterado, em silêncio, sem erro nenhum em lado nenhum. Cole {"id": 9007199254740993} no formatador acima e veja o último algarismo mexer-se.
A correcção é do lado de quem produz: envie os identificadores de 64 bits como texto. Todas as APIs que foram mordidas por isto já o fazem.
Quando recorrer a outra coisa
Esta página serve para ler e corrigir um documento que tem à sua frente. Há duas tarefas vizinhas para as quais é a ferramenta errada:
- Consultar e transformar. Para isso há o
jqna linha de comandos, que também lê em fluxo em vez de carregar tudo para memória — a resposta certa para tudo acima de alguns megabytes. - Impor uma forma. Isso é o JSON Schema, e validar a estrutura é uma pergunta diferente de validar a sintaxe. Um documento pode estar perfeitamente bem formado e continuar sem nenhum dos campos que a sua API exige.
Relacionado
Se o JSON chegou codificado em Base64, descodifique-o primeiro. Se saiu de um token, o descodificador de JWT separa e analisa os dois segmentos por si. E se vai entrar num URL, o codificador de URL mostra qual das três regras de escape quer.
Perguntas sobre JSON
Porque é que o meu JSON falha se parece bem?
Quatro causas explicam quase tudo. Uma vírgula a mais antes de um fecho, que o JavaScript aceita e o JSON não. Plicas em vez de aspas. Comentários, para os quais o JSON não tem sintaxe nenhuma. E chaves sem aspas — {name: "x"} é JavaScript válido e JSON inválido. O validador acima diz qual delas encontrou, em vez de repetir o erro do analisador.
É seguro colar aqui dados de produção?
Nesta página, sim — é analisado no seu navegador e não há pedido nenhum que os pudesse levar. Pode confirmá-lo vendo o separador de rede enquanto escreve. Ainda assim, vale a pena manter o hábito em geral: o JSON que se depura costuma ser uma resposta real de API com registos reais de clientes, e muitos formatadores em linha enviam-no para um servidor para fazer o trabalho. Verifique antes de colar, seja qual for a ferramenta.
O JSON pode ter comentários?
Não. Douglas Crockford retirou-os de propósito, porque as pessoas tinham começado a meter neles directivas de análise. Se precisa de comentários num ficheiro de configuração, as respostas habituais são JSON5 ou JSONC (o que o VS Code usa), ou a convenção de uma chave "_comment" que os consumidores ignoram. Nada disso é JSON, por isso um analisador estrito continuará a rejeitá-los.
O que faz «ordenar chaves» e porque haveria de o querer?
Reordena alfabeticamente, de forma recursiva, as chaves de cada objecto. Os objectos JSON não têm ordem por especificação, portanto dois documentos que só diferem na ordem das chaves são equivalentes — mas um diff de texto mostra todas as linhas como alteradas. Ordenar os dois antes de comparar reduz isso às diferenças que interessam de facto.
Há limite de tamanho?
Só o do seu navegador. A análise acontece na própria página, por isso alguns megabytes num computador de secretária não são problema e vão dar trabalho a um telemóvel mais antigo. Documentos muito grandes tratam-se melhor com jq na linha de comandos, que lê em fluxo em vez de manter a árvore toda em memória.
Porque é que o meu inteiro grande volta errado?
Porque os números do JSON passam a números de JavaScript, que são duplos IEEE 754, e esses perdem precisão acima de 2⁵³ — cerca de 9,007 mil biliões. Um identificador de 19 dígitos ao estilo do Twitter ou um bigint de base de dados volta subtilmente alterado. Não é um defeito do formatador; é a razão pela qual as APIs que usam identificadores de 64 bits os enviam como texto.
Última revisão . Encontrou algo desactualizado? Diga-nos.
