Validador de JSON
Cada erro com a linha, a coluna, a causa e a correção exatas.
Nada do que você cola sai do seu navegador. A lista de permissões connect-src transforma isso em uma garantia do navegador, e não em uma promessa. Confira você mesmo
Validar responde a uma única pergunta: isto é um documento JSON legal? A parte útil é o que acontece quando a resposta é não. A maioria dos validadores diz que um token era inesperado e deixa você procurar. Este diz qual caractere, em que linha e coluna, o que ele esperava no lugar e o que fazer a respeito.
Ele também não para no primeiro problema. Um documento com quatro erros reporta quatro erros, então você corrige tudo em uma passada em vez de quatro.
O que é verificado
A gramática da RFC 8259, inteira. Incluindo as partes que costumam surpreender.
- Espaço em branco
- Entre tokens só quatro caracteres são legais: espaço, tabulação, retorno de carro e quebra de linha. Um espaço inquebrável, um espaço de largura zero ou um espaço ideográfico é erro de sintaxe, e este validador nomeia o caractere em vez de reportar um token inesperado. Eles aparecem o tempo todo ao copiar JSON de uma página web, de um PDF ou de um cliente de chat.
- Números
- Sem zeros à esquerda, sem sinal de mais inicial, sem hexadecimal, sem ponto decimal solto no fim, sem NaN e sem Infinity. Cada violação recebe a própria mensagem, porque cada uma tem causa e correção diferentes.
- Strings
- Só nove sequências de escape são legais. Caracteres de controle abaixo de U+0020 precisam ser escapados. Substitutos solitários são marcados como aviso, porque fazem o parsing mas não sobrevivem a uma recodificação para UTF-8.
- Um único valor de nível superior
- Um documento contém exatamente um. Vários valores, um por linha, é NDJSON, e este validador reconhece esse formato e diz isso em vez de reportar um erro genérico de conteúdo sobrando.
Avisos, que não são erros
Algumas coisas passam pelo parsing e ainda assim estragam a sua tarde. Elas são reportadas separadamente para nunca bloquearem a sua saída.
- Chaves duplicadas
- A RFC 8259 diz que as chaves DEVERIAM ser únicas e deixa o comportamento indefinido quando não são. JavaScript e Python ficam com a última, alguns parsers de Go e Java rejeitam o documento, e uns poucos ficam com a primeira. Aqui você recebe a posição das duas.
- Inteiros fora da faixa segura
- Acima de 2^53-1 um número JavaScript não consegue guardar o valor exato. O aviso informa qual valor o JSON.parse devolveria no lugar.
- Marca de ordem de bytes
- Um U+FEFF no início é aceito aqui e reportado, porque o JSON.parse dos navegadores e do Node rejeita de imediato.
- Aninhamento muito profundo
- Este parser é iterativo e não tem limite de profundidade, mas muitos consumidores têm. Medido nesta máquina, o V8 se recusa a serializar uma estrutura com mais de cerca de 4.800 níveis, então um documento que você consegue ler pode continuar sendo um que você não consegue escrever de volta.
Validar o formato além da sintaxe
A validação de sintaxe só diz que o documento está bem formado, não que ele contém o que você esperava. Para isso é preciso JSON Schema, que descreve propriedades obrigatórias, tipos e restrições. O nosso gerador de schema produz um ponto de partida a partir de um payload de exemplo.
How to do this in code
Verificar validade em código, e tirar dali um erro que sirva para alguma coisa.
js JavaScript
Não existe validador sem exceção na biblioteca padrão, então o try/catch é a API.
function validate(text) {
try {
JSON.parse(text);
return { ok: true };
} catch (e) {
// Modern V8 includes a (line L column C) suffix in the message.
return { ok: false, message: e.message };
}
} py Python
JSONDecodeError carrega msg, lineno, colno, pos e doc, que é mais estrutura do que a maioria dos runtimes oferece.
import json
try:
json.loads(text)
except json.JSONDecodeError as e:
print(f"{e.msg} at line {e.lineno} column {e.colno} (char {e.pos})") sh Shell
jq empty faz o parsing da entrada e não imprime nada, o que o torna uma verificação de validade limpa dentro de um script de CI.
# jq exits non-zero and prints the position on failure
jq empty input.json
# Python, no extra install
python -m json.tool input.json > /dev/null go Go
O Go reporta um deslocamento em bytes em vez de uma linha, então você mesmo precisa contar as quebras.
if !json.Valid(data) {
// Valid() gives no position. To get one, decode and
// inspect the SyntaxError:
var v any
if err := json.Unmarshal(data, &v); err != nil {
var se *json.SyntaxError
if errors.As(err, &se) {
line := 1 + bytes.Count(data[:se.Offset], []byte("\n"))
return fmt.Errorf("%v at line %d", se, line)
}
}
} Perguntas frequentes
- Por que ele reporta vários erros quando outros validadores reportam um?
- Porque o parser se recupera em vez de parar. Depois de reportar um problema ele se ressincroniza e continua, então um documento com uma vírgula sobrando, uma string com aspas simples e uma chave sem aspas reporta os três em uma passada só.
- Uma string ou um número sozinho é JSON válido?
- Sim, desde a RFC 7159, em 2014. A RFC 4627 original exigia que o valor de nível superior fosse um objeto ou um array; a especificação atual, a RFC 8259, permite qualquer valor. Então "olá", 42 e null são documentos JSON completos e válidos.
- Vírgulas sobrando são permitidas em algum caso?
- Em JSON, não. São permitidas em JavaScript, em JSON5 e em JSONC, que é o que o VS Code usa nos próprios arquivos de configuração. Se quem consome aceita JSONC você pode mantê-las; caso contrário, a ferramenta de reparo as remove.
- E os comentários?
- JSON não tem, por decisão de projeto. Douglas Crockford os removeu de propósito, com o argumento de que as pessoas os usavam para carregar diretivas de parsing. Use JSONC ou JSON5, ou mova a observação para uma chave como "_comment".