Validador JSON Schema
Valide JSON contra qualquer JSON Schema instantaneamente no navegador. Suporta Draft 2020-12, 2019-09 e Draft-07 com mensagens de erro com caminho preciso. 100% privado — sem upload, sem conta, gratuito.
O que é um Validador JSON Schema?
Um validador JSON Schema é um programa que recebe dois documentos JSON — um documento de dados e um documento de esquema — e reporta se os dados cumprem o contrato do esquema. O esquema declara tipos de campos, chaves required, intervalos de valores, valores enum permitidos, padrões regex e regras estruturais usando um vocabulário fixo (type, properties, required, items, enum, oneOf, allOf, $ref, format). O validador percorre ambos os documentos em paralelo e emite zero ou mais erros, cada um fixado a um caminho JSON Pointer dentro dos dados.
A validação corre em tempo de execução, na fronteira entre o input não confiável e o seu código. Os tipos de TypeScript desaparecem em tempo de compilação e não conseguem ajudar com JSON que chega de um webhook, uma API de terceiros ou uma colagem do utilizador — esse vazio é exatamente o que JSON Schema preenche. Junte-o a TypeScript (ou Pydantic em Python) e obtém garantias em tempo de compilação dentro do seu código mais garantias em tempo de execução na fronteira.
Draft 2020-12 é a especificação atual e a que deve escolher para novos projetos em 2026. Drafts anteriores (2019-09, Draft-07, Draft-06, Draft-04) sobrevivem em código legado — Draft-07 continua comum em charts Helm, definições do VS Code e configurações antigas de Ajv. OpenAPI 3.1 usa Draft 2020-12 nativamente; OpenAPI 3.0 usa um subconjunto de Draft 4.
Esta ferramenta corre inteiramente no seu navegador. O seu JSON, o seu esquema e o output da validação nunca saem da sua máquina — segura para contratos de API proprietários e payloads sensíveis. Os ponteiros $ref internos resolvem-se automaticamente; os refs HTTP externos estão intencionalmente desativados para preservar a privacidade.
A trabalhar com ferramentas JSON adjacentes? Formate o JSON com o Formatador JSON antes de colar; compare dois documentos JSON com o JSON Diff; converta com JSON para YAML e YAML para JSON. Para validação end-to-end em Node, Python e navegador, veja o nosso guia de validação JSON Schema.
// A 5-line schema that catches three real bugs
const schema = {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": { "type": "integer", "minimum": 1 },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "minimum": 0, "maximum": 150 }
},
"required": ["id", "email"],
"additionalProperties": false
};
// Three bugs the schema catches:
const bad = { "id": "42", "age": 200 };
// /id → type: expected integer, got string
// /email → required: missing
// /age → maximum: 200 > 150
// In Node: new Ajv().compile(schema)(bad) // false; ajv.errors has the paths
// In Python: jsonschema.validate(bad, schema)
// In the browser: this tool — same errors, same paths, no install Funcionalidades principais
Suporte multi-Draft
Draft 2020-12 (predefinido), 2019-09 e Draft-07. Deteta automaticamente o draft a partir do URI $schema; seletor de fallback para esquemas que não o tenham.
Erros com caminho preciso
Cada erro inclui um JSON Pointer (p. ex. /user/email/0), a keyword que falha (type, required, pattern) e uma mensagem de uma linha. Clique para saltar para a localização.
Validação ao vivo
Valida enquanto escreve. Os erros atualizam em tempo real para que itere sobre o esquema ou os dados sem passar por botões Validate.
Cobertura de keywords format
email, uri, uuid, date, date-time, ipv4, ipv6, hostname, regex — os formats que de facto usa, validados com padrões testados em produção.
100% baseado no navegador
Os inputs nunca saem da sua máquina. Sem upload, sem analítica sobre o que cola, sem localStorage do JSON. Segura para contratos proprietários e payloads sensíveis.
Esquemas de exemplo, num clique
Presets carregáveis (formulário de registo, envelope de webhook, ficheiro de configuração, array de pedidos) levam-no a uma validação funcional em menos de cinco segundos.
Exemplos
Objeto válido — required + tipos
{
"id": 42,
"email": "alice@example.com",
"age": 30
} {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": { "type": "integer", "minimum": 1 },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "minimum": 0, "maximum": 150 }
},
"required": ["id", "email"],
"additionalProperties": false
} O esquema declara id e email como required e fixa os tipos. Os dados acima passam — todas as restrições são satisfeitas. Tente remover email ou mudar id para uma string para ver erros com caminho preciso.
Inválido — required em falta + tipo errado
{
"id": "42",
"age": 200
} {
"type": "object",
"properties": {
"id": { "type": "integer" },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "maximum": 150 }
},
"required": ["id", "email"]
} Três erros: /id é uma string em vez de integer, /email está em falta, /age (200) excede o maximum 150. Cada erro reporta o caminho JSON Pointer exato para que possa corrigir os dados — ou relaxar o esquema — sem adivinhar.
União discriminada — oneOf com const
{
"type": "order.created",
"data": { "orderId": "ORD-001234", "totalUsd": 49.99 }
} {
"oneOf": [
{
"properties": {
"type": { "const": "order.created" },
"data": {
"type": "object",
"properties": {
"orderId": { "type": "string", "pattern": "^ORD-[0-9]{6}$" },
"totalUsd": { "type": "number", "minimum": 0 }
},
"required": ["orderId", "totalUsd"]
}
},
"required": ["type", "data"]
},
{
"properties": {
"type": { "const": "order.refunded" },
"data": { "type": "object", "required": ["refundId"] }
},
"required": ["type", "data"]
}
]
} Validação de envelope de webhook. O primeiro ramo de oneOf corresponde porque type é "order.created". Mude type para "order.refunded" ou quebre o pattern de orderId para ver como oneOf reporta as falhas por ramo.
Array de objetos — items + uniqueItems
[
{ "sku": "A1", "qty": 3 },
{ "sku": "B2", "qty": 5 },
{ "sku": "A1", "qty": 3 }
] {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "object",
"properties": {
"sku": { "type": "string", "pattern": "^[A-Z][0-9]+$" },
"qty": { "type": "integer", "minimum": 1 }
},
"required": ["sku", "qty"]
}
} Dois itens são byte-idênticos, então uniqueItems dispara. Os itens 0 e 2 colidem — o validador reporta o duplicado na raiz do array. Útil para apanhar duplicados de linhas de carrinho e bugs de merge em pedidos de envio.
Como usar
- 1
Cole o seu JSON Schema
Coloque o seu esquema no painel direito. O validador deteta automaticamente o draft a partir do URI $schema se presente; caso contrário, escolha Draft 2020-12, 2019-09 ou Draft-07 na barra de ferramentas.
- 2
Cole os seus dados JSON
Coloque o documento JSON que quer verificar no painel esquerdo. A validação corre enquanto escreve; inputs grandes (>200 KB) mudam para um botão Validate manual para manter a digitação fluida.
- 3
Leia a lista de erros
Cada erro tem um caminho JSON Pointer, uma keyword e uma mensagem de uma linha. Clique num erro para saltar para a localização nos seus dados, corrija-o e veja o contador descer em tempo real.
Armadilhas comuns de JSON Schema
Type: integer vs number
JSON Schema trata 1.0 como number mas não como integer. Se o seu contrato diz integer, o validador rejeita 1.0 — mesmo que a maioria das linguagens o considere igual a 1. Escolha number a menos que precise mesmo de integer.
{ "qty": 1.0 } schema: { "type": "integer" } → error: not an integer { "qty": 1 } schema: { "type": "integer" } → valid required no nível de aninhamento errado
required tem de ficar ao lado de properties, não dentro de uma propriedade. Um array required dentro da declaração de uma propriedade é silenciosamente ignorado — o validador nunca o aplica.
{ "properties": { "name": { "type": "string", "required": true } } } { "properties": { "name": { "type": "string" } }, "required": ["name"] } additionalProperties por defeito é true
Sem additionalProperties: false o esquema é aberto — qualquer chave extra passa. Esquecer isto é a razão mais comum para os esquemas "aceitarem tudo".
{ "properties": { "id": { "type": "integer" } } } accepts: { "id": 1, "foo": "bar", "x": null } { "properties": { "id": { "type": "integer" } }, "additionalProperties": false } OpenAPI 3.0 nullable vs array de tipos Draft 2020-12
OpenAPI 3.0 usa nullable: true; Draft 2020-12 usa type: ["string", "null"]. Misturá-los produz esquemas que parecem corretos mas, na realidade, nunca permitem null.
{ "type": "string", "nullable": true } in 2020-12: nullable is just an unknown keyword { "type": ["string", "null"] } in 2020-12: explicitly allows null Pattern sem âncoras
O regex de JSON Schema corresponde em qualquer parte por defeito — pattern: "^[A-Z]+$" ancora à string inteira, mas pattern: "[A-Z]+" corresponde se existir alguma maiúscula em qualquer ponto.
pattern: "[A-Z]+" accepts: "helloX" (because X matches)
pattern: "^[A-Z]+$" accepts only: "HELLO"
oneOf onde se queria anyOf
oneOf exige que apenas um ramo corresponda. Se dois ramos aceitam a mesma forma, oneOf falha em dados que anyOf passaria — e a mensagem de erro é confusa ("matches more than one").
oneOf: [ { type: "string" }, { type: "string", maxLength: 10 } ] on: "hi" → error: matches both anyOf: [ { type: "string" }, { type: "string", maxLength: 10 } ] on: "hi" → valid Casos de uso comuns
- Validação de pedido de API
- Cole um corpo de pedido e o esquema do seu endpoint antes do deploy. Apanhe respostas 400 que os seus testes não cobriram — campos required em falta, tipos errados, números fora do intervalo.
- Verificação de payload de webhook
- O fornecedor enviou um payload que o seu handler rejeita? Valide o payload real contra o seu esquema, depois contra o esquema publicado do fornecedor. A diferença entre os dois é o seu bug.
- Linting de ficheiros de configuração
- package.json, tsconfig.json, helm values.yaml — cada ficheiro de configuração tem um esquema público. Cole o esquema, cole a configuração, encontre o typo. Salte o tentativa-erro.
- Teste de componentes OpenAPI
- Extraia um componente de esquema de um documento OpenAPI 3.1, cole-o aqui, valide payloads de exemplo. Mais rápido do que levantar um mock server, determinístico, sem SDK.
- Pré-voo de submissão de formulário
- Cole um payload de formulário de exemplo antes de cablar a validação no frontend. Confirme que o esquema rejeita o que espera, aceita o que espera, e depois envie o mesmo esquema para cliente e servidor.
- Verificação de contrato de pipeline de dados
- O output ETL desviou-se? Cole uma linha de exemplo e o esquema a jusante. Identifique qual produtor mudou e quais chaves se partiram antes de o pipeline retentar 10.000 registos.
Detalhes técnicos
- Conforme com Draft 2020-12
- Implementa a especificação Draft 2020-12 publicada — keywords, sistema de tipos, vocabulário format. Verificado contra o output de Ajv 8.x e ajv-formats.
- Caminhos de erro JSON Pointer
- Os erros usam JSON Pointer RFC 6901 (/user/email/0). Cada falha de keyword aponta para uma única localização resolúvel nos dados — sem ambiguidade, sem pesquisa por string.
- Resolução interna de $ref
- Resolve ponteiros $ref dentro de um único documento (#/$defs/foo, #/properties/bar). Ciclos detetados e reportados. $ref HTTP externos desativados por privacidade.
Boas práticas
- Defina sempre additionalProperties: false
- Em contratos de input (corpos de pedido, ficheiros de configuração, mensagens de fila), chaves desconhecidas costumam ser bugs — typos, campos acidentais ou sondagem de atacante. Rejeite-as por defeito.
- Use $defs para subesquemas reutilizáveis
- Se inlinar a mesma forma duas vezes, vão divergir. Mova as definições partilhadas para $defs e referencie com $ref — uma única fonte de verdade, cada alteração aplica-se em todo o lado.
- Valide antes da lógica de negócio
- Corra a validação de esquema logo a seguir a JSON.parse, antes de tocar na estrutura analisada. Estreitamento de tipos, valores por defeito e persistência assumem que o contrato se mantém — garanta que se mantém.
Perguntas frequentes
O que é a validação JSON Schema?
Que drafts de JSON Schema é que este validador suporta?
Como valido JSON contra um esquema?
Qual é a diferença entre validação JSON Schema e validação de sintaxe JSON?
Porque é que o meu esquema rejeita JSON que parece correto?
Suporta $ref e referências remotas a esquemas?
O que faz additionalProperties: false?
Como valido JSON contra um esquema em Node.js ou Python?
Qual é a diferença entre oneOf, anyOf e allOf?
Suporta esquemas OpenAPI?
Porque é que o validador diz que o meu JSON Schema é, ele próprio, inválido?
A ferramenta envia o meu JSON ou esquema para um servidor?
Posso validar JSON Lines (NDJSON) ou múltiplos documentos?
Ferramentas relacionadas
Ver todas as ferramentas →Decodificador e Codificador Base64
Codificação e Formatação
Decodifique e codifique Base64 online gratuitamente. Conversão em tempo real com suporte completo a UTF-8 e emoji. 100% privado — executa no seu navegador. Sem necessidade de cadastro.
JSON Diff (Comparar)
Codificação e Formatação
Compare dois arquivos JSON instantaneamente no navegador. Destaque lado a lado, saída JSON Patch (RFC 6902), ignore campos ruidosos como timestamps e IDs. 100% privado, sem upload.
Formatador e Validador JSON
Codificação e Formatação
Formate, valide e embeleze JSON instantaneamente no seu navegador. Ferramenta online gratuita com validação de sintaxe, detecção de erros, minificação e cópia com um clique. 100% privado — seus dados nunca saem do seu dispositivo.
Conversor JSON para YAML
Codificação e Formatação
Cole JSON e obtenha YAML instantaneamente. Conversão ao vivo no navegador. K8s/Compose, indentação 2/4 espaços, Norway-safe. 100% privado, sem upload.
Gerador de QR Code — URL, WiFi, vCard, Email, SMS
Codificação e Formatação
Gerador de QR Code grátis. Crie códigos QR estáticos para URL, WiFi, vCard, email e SMS. Download em SVG e PNG. Sem expiração, sem cadastro, 100% no seu navegador.
Codificador e Decodificador de URL com Analisador Integrado
Codificação e Formatação
Cole uma URL para decodificar ou codificar em tempo real. Analisador de URL integrado decompõe cada componente em campos editáveis. Modo duplo: encodeURI e encodeURIComponent. Privado — nenhum dado enviado a servidor.