Ferramentas para desenvolvedores · Formatador e validador JSON
Como um validador JSON encontra a linha e coluna exatas de um erro
· Como funciona
JSON validação fluxo de trabalho do desenvolvedor
Os mecanismos do navegador relatam falhas JSON.parse de maneira diferente e alguns fornecem apenas um deslocamento de caracteres. Esta postagem explica como um validador transforma isso em uma linha e coluna, e por que a posição marca onde a análise parou, e não onde você cometeu o erro.
A mensagem de erro que não diz nada - por que 'Token inesperado em JSON na posição 1432' é inútil em um arquivo de linha 400
Um erro como “Token inesperado” é frustrante em uma configuração longa porque não oferece nenhum local que você possa abrir em seu editor. JSON.parse é o analisador autorizado do navegador, mas seu texto de diagnóstico difere entre os mecanismos e versões de JavaScript. ToolAcre não adivinha a localização combinando uma string de erro em inglês instável. Se JSON.parse falhar, um scanner estrito separado percorre o texto original para identificar o primeiro caractere que a gramática JSON não pode aceitar.
O que um analisador JSON realmente faz enquanto lê - um passeio pela tokenização e pela gramática descendente recursiva que consome um valor por vez
JSON possui seis caracteres estruturais – colchetes, colchetes, dois pontos e vírgula – e valores que podem ser strings, números, matrizes, objetos, verdadeiro, falso ou nulo. Um scanner precisa saber se está dentro de uma string entre aspas antes de chamar uma vírgula de separador: {"note":"A,B"} tem um valor, não dois. Ele percorre um valor ou membro do objeto e verifica o que pode seguir legalmente. RFC 8259 define esta gramática e, diferentemente dos objetos literais JavaScript, não permite comentários ou vírgulas finais.
Do deslocamento de caracteres à linha e coluna — contando novas linhas até o deslocamento de falha e por que terminações CRLF e caracteres multibyte complicam a contagem
Um scanner geralmente começa com um deslocamento baseado em zero na string JavaScript original. Para tornar isso útil, conte as quebras de linha antes do deslocamento e descubra a que distância a falha está da última quebra. CRLF deve ser tratado como um final de linha visual, não como duas linhas; as posições nas strings JavaScript contam UTF-16 unidades de código, não UTF-8 bytes no disco. Um emoji não BMP pode ocupar duas unidades de código em um editor que mostra visualmente um glifo. A IU informa uma linha, coluna e trecho para que você possa verificar o cursor em relação ao arquivo colado.
Onde a análise para não é onde está o erro - uma vírgula faltando é relatada na próxima chave, e uma aspa perdida pode empurrar o erro muitas linhas para baixo
O primeiro token impossível geralmente ocorre após o erro original. Em um objeto, esquecer uma vírgula depois de true torna ilegal a citação que inicia a próxima propriedade: o analisador estava esperando uma vírgula ou chave de fechamento. Uma string não terminada pode fazer com que o erro apareça em uma quebra de linha posterior ou no final da entrada. Leia de trás para frente a partir do ponto relatado para encontrar o delimitador ausente; não presuma que o caractere sob o cursor deve ser excluído.
Exemplo resolvido: uma configuração com uma vírgula faltando — a posição relatada, os tokens ao redor e como retroceder até a causa real
Experimente o documento literal de três linhas {"name":"demo", seguido por "enabled":true na linha dois e "port":8080} na linha três, sem vírgula depois de true. ToolAcre reporta linha 3, coluna 1, deslocamento 31: esperava uma vírgula ou } após a propriedade anterior e mostra um acento circunflexo sob a primeira aspa de "porta". Insira uma vírgula no final da linha dois e valide novamente. Este é um diagnóstico do primeiro obstáculo de sintaxe, não um julgamento de que a palavra “porta” está errada.
Como os mecanismos de navegador diferem - V8, SpiderMonkey e JavaScriptCore expressam a mesma falha de maneira diferente, e é por isso que um relatório consistente de linhas e colunas ajuda
V8, SpiderMonkey e JavaScriptCore usaram palavras diferentes e, às vezes, trechos contextuais diferentes para a mesma falha JSON.parse. O scanner de ToolAcre fornece sua própria razão estrutural e localização quando o analisador nativo rejeita o valor. Se o scanner discordar de JSON.parse, a ferramenta retornará o erro do mecanismo em vez de fabricar uma posição. Essa alternativa é mais segura do que apontar com confiança para um personagem adivinhado.
O que isso não cobre — problemas semânticos, como tipos errados, campos ausentes ou violações de esquema, que um validador de sintaxe nunca sinalizará
Um objeto sintaticamente válido ainda pode estar errado para sua aplicação: um campo obrigatório ausente, uma idade escrita como texto, duas chaves duplicadas ou uma referência a um arquivo inexistente não são automaticamente inválidos JSON. RFC 8259 diz que os nomes dos membros devem ser exclusivos para interoperabilidade, mas a mera análise não impõe seu esquema API. Valide a sintaxe aqui e valide as restrições semânticas no programa que consome o documento.
Conclusão: leia a posição como 'o primeiro token que a gramática não pôde aceitar' - e como o formatador e validador JSON relata essa linha e coluna sem enviar o texto
Trate a posição relatada como “o primeiro sinal que esta gramática não pôde aceitar”. Trabalhe de trás para frente até a causa, corrija um problema e execute novamente. O formatador e validador JSON faz isso localmente sem carregar uma configuração colada. Não cole credenciais de produção reais em nenhum site público se um editor offline puder diagnosticar o arquivo.