Ferramentas para desenvolvedores · Formatador e validador JSON
JavaScript literais de objeto vs JSON: por que aspas simples falham na validação
· Como funciona
JSON fluxo de trabalho do desenvolvedor validação
Um objeto impresso por um console JavaScript se parece com JSON, mas geralmente não é. Esta postagem lista as diferenças exatas (aspas, chaves sem aspas, indefinidas, funções) e mostra onde cada uma aciona um validador.
Saiu do console, então por que é inválido?
Saiu do console, então por que é inválido? — os consoles do desenvolvedor exibem valores JavaScript como texto fonte JavaScript, não como uma serialização JSON garantida. Um objeto copiado pode conter nomes de propriedades simples, strings entre aspas simples, `undefined` ou anotações específicas do navegador. Tudo isso pode ser compreensível para um mecanismo JavaScript ou leitor humano, mas falha imediatamente em um arquivo `.json`, cuja gramática é intencionalmente menor e independente do código executável.
Considere `{name: "Ada", active: true, missing: undefined}`. Os colchetes, dois pontos e booleano se assemelham a JSON, mas a primeira chave simples já viola a regra do membro do objeto e `undefined` falharia mais tarde. ToolAcre relata o primeiro caractere ou valor não suportado com uma linha e coluna, portanto, é melhor fazer a conversão em ordem.
Strings devem usar aspas duplas
As strings devem usar aspas duplas — JSON define uma string como caracteres entre `"`, com escapes de barra invertida quando necessário. Uma aspa simples não tem função como delimitador de string. Quando um validador atende `'Ada'`, ele não inicia uma string e depois se opõe ao seu conteúdo; rejeita o próprio apóstrofo de abertura. Isso se aplica igualmente a nomes de propriedades e valores de string, embora JavaScript permita qualquer estilo de aspas para seus próprios literais.
A conversão de aspas requer mais cuidado do que a substituição global de cada apóstrofo. Um apóstrofo dentro de um texto como `Ada's profile` é conteúdo comum, uma vez que o valor está entre aspas duplas, enquanto as aspas duplas existentes dentro desse conteúdo devem ser escapadas. O formulário JSON válido é `"Ada's "profile""`.
As chaves devem ser strings entre aspas
As chaves devem ser strings entre aspas - literais de objeto JavaScript permitem nomes de estilo de identificador, como `{name: 1}` e nomes computados, como `{[expression]: 1}`. JSON não permite abreviações. Após uma chave de abertura ou vírgula, o próximo membro deve começar com uma string entre aspas duplas, seguida por dois pontos. A representação válida é `{"name": 1}`. Um validador que aponta para `n` está identificando o local exato onde um orçamento foi solicitado.
Citar cada chave também remove a ambigüidade em torno de espaços, hífens e palavras reservadas. JavaScript pode exigir sintaxe de origem diferente para esses casos, mas JSON usa uma regra consistente: `"display-name"`, `"first name"` e `"default"` são todos nomes de membros comuns. Chaves de aparência numérica também são strings.
Valores JSON simplesmente não possui
Valores JSON simplesmente não possui - seu vocabulário de valores é objeto, array, string, número, `true`, `false` e `null`. Não há `undefined`, `NaN`, `Infinity`, função, expressão regular, BigInt ou literal de data. Os comentários estão ausentes da gramática e os números não podem usar sinais de adição hexadecimais, binários, iniciais ou separadores numéricos JavaScript. Cada construção emprestada eventualmente atinge um caractere que não pode iniciar ou continuar um valor JSON válido.
A conversão requer uma decisão de dados em vez de um truque ortográfico. Substitua `undefined` por `null` somente se um valor vazio explícito corresponder ao contrato do aplicativo; caso contrário, remova o membro ou forneça um valor real. Codifique datas como strings acordadas, geralmente ISO 8601. Represente números não finitos de acordo com o API receptor em vez de inventar um token JSON.
Exemplo resolvido: convertendo um dump do console em JSON válido
Exemplo resolvido: convertendo um dump do console em JSON válido – comece com `{name: 'Ada', active: true, score: NaN, updated: new Date()}`. Cite `name`, `active`, `score` e `updated` entre aspas duplas. Altere o valor do nome para uma string entre aspas duplas. Decida que uma pontuação indisponível deve ser `null` e substitua a expressão do construtor pela string de carimbo de data/hora real que ela deveria produzir. O documento agora contém apenas JSON membros e valores.
A forma finalizada pode ser `{"name":"Ada","active":true,"score":null,"updated":"2026-03-21T10:00:00Z"}`. Valide após cada categoria de reparo porque o primeiro erro pode ocultar a sintaxe posterior somente JavaScript. A formatação do resultado aceito expõe sua estrutura sem realizar qualquer conversão adicional.
A armadilha reversa - JSON válido que JavaScript seria lido de forma diferente, como números inteiros muito grandes e a chave __proto__
A armadilha reversa - JSON válido ainda pode adquirir comportamento ou limitações específicas de JavaScript após a análise. Os números JSON não têm limite de precisão integrado na gramática, mas JSON.parse produz valores numéricos JavaScript. Um número inteiro além do intervalo seguro pode, portanto, ser arredondado silenciosamente. Se cada dígito for importante, codifique o identificador como uma string ou use um analisador e um tipo de dados projetados para preservar números de precisão arbitrária, em vez de confiar em uma verificação de sintaxe bem-sucedida.
O nome do membro `"__proto__"` também é válido JSON e JSON.parse o cria como uma propriedade de dados própria. O problema poderá começar mais tarde se o código do aplicativo copiar as propriedades analisadas em outro objeto com atribuição insegura ou comportamento de mesclagem. A validação prova que o texto segue a gramática JSON; isso não prova que todas as chaves sejam seguras para todos os consumidores.
O que isso não cobre
O que isso não cobre — JSON5, JSONC e linguagens de configuração que aceitam deliberadamente comentários, vírgulas finais, nomes sem aspas ou strings entre aspas simples. Esses formatos resolvem diferentes problemas de autoria e precisam de analisadores que implementem suas próprias gramáticas. Um validador JSON estrito não deve reinterpretá-los silenciosamente, porque aceitar sintaxe extra tornaria seu resultado enganoso para APIs, metadados de pacotes e outros destinos que realmente exigem o padrão JSON.
Esta distinção também exclui a avaliação JavaScript arbitrária. Executar texto colado por meio de `eval` ou de um construtor Function apenas para transformar um literal de objeto em dados pode executar getters, chamadas ou outras expressões hostis. Se a fonte JavaScript for confiável sob seu controle, serialize o valor real com JSON.stringify. Se a fonte for um texto não confiável, não o execute.
Conclusão: um literal é código, JSON são dados
Conclusão: um literal é código, JSON são dados – a semelhança visual não torna suas gramáticas intercambiáveis. JSON requer strings entre aspas duplas e nomes de membros, permite apenas um pequeno conjunto fixo de tipos de valores e não contém comentários ou expressões executáveis. Um diagnóstico de linha e coluna marca o primeiro lugar onde a fonte copiada sai dessa gramática. Reparar esse ponto e validar novamente é mais confiável do que aplicar uma ampla pesquisa e substituição a um dump do console.
Ao controlar o valor JavaScript, gere JSON com JSON.stringify em vez de copiar sua representação do console. Ao receber texto, analise-o apenas com o analisador para seu formato declarado e nunca execute-o como um atalho. A validação JSON bem-sucedida estabelece sintaxe, não precisão numérica, conformidade de esquema ou manipulação segura de propriedades downstream.