Pular para o conteúdo principal

Analisar JSON

O inspetor JSON verifica a sintaxe RFC 8259 no navegador e informa contagens por tipo, profundidade e equivalências entre linguagens. Também mostra quais tokens numéricos originais mudariam ao serem convertidos para Number do JavaScript. A inspeção não altera o texto original; os conversores de valores rejeitam essas conversões inseguras.

Só local
Documento JSON
0 B1 linhaLin. 1, Col. 1

Cole um documento JSON ou clique em “Carregar exemplo” para analisar sua estrutura.

Como funciona o Analisar JSON?

“Analisa?” é a pergunta que o validador responde. Esta ferramenta responde à seguinte, que costuma ser a mais interessante: no que ele se converteu? Um documento pode ser perfeitamente válido e ainda assim não ser aquilo que o seu código espera, e essa diferença raramente aparece numa simples leitura.

O parser é próprio e não chama JSON.parse. Uma pilha de trabalho explícita e iterativa permite inspecionar documentos profundamente aninhados sem estourar a pilha de chamadas. Conteúdo depois do valor raiz é rejeitado. Cada chave é atribuída com proteção como propriedade própria: __proto__ permanece uma chave normal em vez de alterar o protótipo do objeto.

Em seguida, a análise percorre o valor interpretado e conta o que está lá: quantos objetos, arrays, strings, números, booleanos e nulls, qual a profundidade do aninhamento e quantas chaves distintas aparecem. Isso, sozinho, costuma bastar para identificar o problema — um array que você esperava conter objetos e que só contém strings, uma estrutura três níveis mais profunda do que o schema permite, um documento que é 90% nulls porque um join a montante falhou.

JSON tem um único tipo numérico. JSON.parse do JavaScript o converte em double IEEE-754, que representa todos os inteiros exatamente apenas até 2^53−1. Por exemplo, 9007199254740993 vira 9007199254740992 sem erro de sintaxe nativo. Este inspetor verifica os tokens numéricos originais, incluindo decimais e expoentes, e sinaliza valores decimais alterados como riscos de conversão. Ele conta a estrutura sem exportar valores arredondados. O Formatador JSON e o Minificador JSON preservam os tokens originais; os conversores de valores rejeitam esses números inseguros.

A mesma tabela mostra o restante do mapeamento, porque as premissas variam conforme a linguagem. Go entrega float64 para todo número, a menos que você decodifique em uma struct tipada. Python distingue int de float e por isso mantém inteiros grandes exatos. Java e C# recorrem a BigDecimal ou decimal quando configurados para isso.

Documento

{ "id": 9007199254740993, "price": 0.1 }

Estrutura e risco numérico

3 values · depth 1 · 2 distinct keys

number   2   →  number (IEEE-754 double)

JavaScript Number conversion risk (source unchanged):
  9007199254740993 → 9007199254740992

Documento → Estrutura e risco numérico

Documento

{
  "id": 42,
  "name": "Ada"
  "active": true
}

Estrutura e risco numérico

Missing comma between object key-value pairs.

Line 4, column 3

  "active": true
  ^

Quais opções e casos-limite o Analisar JSON suporta?

Referência técnica e opções
ParâmetroTipoPadrãoComportamento e casos-limite
GramáticaRFC 8259estritoSem comentários, vírgulas finais, aspas simples, chaves sem aspas, NaN ou Infinity. Essas são regras de sintaxe JSON; uma API pode impor também seu próprio schema e limites de tamanho ou números. JSON5 e JSONC são rejeitados.
Conteúdo ao finalrejeitado—A RFC 8259 §2 define um documento como exatamente um valor. Dois objetos concatenados são um sintoma comum de uma linha de log que foi dividida incorretamente, e são reportados em vez de truncados silenciosamente no primeiro.
Precisão numéricaIEEE-754sinalizadoOs tokens numéricos originais são comparados com sua conversão decimal de ida e volta para Number do JavaScript. Inteiros e decimais alterados, estouros e valores reduzidos a zero são sinalizados. O texto original não muda e nenhum documento arredondado é exportado.
Chaves duplicadasa última vence—A RFC 8259 deixa isso indefinido; quase todo parser mantém a última ocorrência, e este corresponde a isso. Vale a pena saber, porque é uma superfície de ataque real quando dois sistemas em uma cadeia discordam.
__proto__propriedade própria—Atribuído via defineProperty, então ele se torna uma chave normal em vez de re-apontar o protótipo. Corresponde ao JSON.parse, e é a proteção que a maioria dos parsers feitos à mão está perdendo.
Profundidade de aninhamentoiterativosem limiteO parser usa uma pilha explícita, então a profundidade é limitada pela memória e não pela pilha de chamadas. Um documento de 20,000 níveis é coberto por um teste.
UnicodeUTF-8— escapes são decodificados, e pares substitutos são recombinados para que caracteres astrais sobrevivam. Um byte-order mark antes do root é reportado em vez de ser tratado como conteúdo.
Tamanho de entradabytes8 MBTeto na thread principal. Acima disso, o parsing é recusado em vez de tentado. Nada é enviado em nenhum tamanho.

Perguntas frequentes

Qual a diferença para o validador de JSON?

O validador se concentra em erros de sintaxe JSON e reparos. Este inspetor também informa contagens por tipo, profundidade, chaves distintas, equivalências entre linguagens e riscos de conversão numérica. Um JSON válido pode conter números que mudam ao serem convertidos por JavaScript; a inspeção mostra o token original e uma prévia Number claramente identificada sem mudar o documento.

Meu ID mudou de valor depois da análise. O que aconteceu?

JSON.parse nativo do JavaScript usa números IEEE-754 e pode arredondar IDs grandes sem erro de sintaxe: 9007199254740993 vira 9007199254740992. Este inspetor mostra o risco a partir do token original. Os conversores de valores do ToolsByUs rejeitam conversões que perderiam dígitos, enquanto o Formatador e o Minificador preservam o texto. Envie IDs exatos como strings ou use um parser com inteiros de precisão arbitrária, como o decodificador JSON padrão do Python.

O que acontece com chaves duplicadas?

A última ocorrência vence, que é o que quase todo parser faz e o que a RFC 8259 prefere não especificar. Vale saber disso em vez de ignorar: se dois sistemas em uma cadeia de requisições resolvem duplicatas de formas diferentes, uma carga pode ser validada segundo uma interpretação e executada sob outra, o que é uma classe genuína de falha de segurança.

Por que ele rejeita meu JSON com comentários?

Porque a RFC 8259 não tem comentários, e a razão de ser de um parser estrito é dizer o que uma API vai aceitar. Se o seu arquivo é uma configuração — tsconfig.json, .eslintrc.json — ele é JSONC, e o formatador de JSON aceita comentários e vírgulas finais e pode removê-los para você.

0.1 é exatamente 0.1 depois da análise?

Não, e isso não é um problema do JSON — é ponto flutuante binário. 0.1 não tem representação exata como double em nenhuma linguagem, razão pela qual 0.1 + 0.2 é famosamente diferente de 0.3. Para dinheiro, a resposta padrão é carregar unidades inteiras menores (pence, centavos) ou uma string decimal, nunca um float.

Meu documento é enviado a algum lugar?

Não. A análise ocorre no seu navegador sem enviar o documento. Depois que esta página e seus recursos forem carregados, a própria inspeção JSON funciona sem conexão de rede.