Pular para o conteúdo

JSON perfeito para validar com JSON Schema

  • por

Aprenda a criar JSON perfeito e validá-lo com json schema: práticas, exemplos, erros comuns e ferramentas para APIs mais seguras e confiáveis.

Por que um JSON impecável é o segredo de integrações confiáveis

Se você troca dados entre serviços, sabe que um pequeno deslize em um campo pode quebrar todo um fluxo. Um JSON bem projetado elimina ambiguidades, reduz retrabalho e acelera a integração com parceiros e equipes internas. Quando combinado com json schema, você transforma seu payload em um contrato claro e testável, que previne erros antes de chegar em produção.

Além de qualidade, há ganhos de produtividade. Equipes que padronizam a estrutura, os tipos e os formatos dos campos conseguem validar, documentar e evoluir APIs com muito menos fricção. O resultado é um ciclo de desenvolvimento mais previsível, menos incidentes e uma experiência consistente para consumidores.

Fundamentos do JSON bem-formado

Regras de formato que evitam falhas

A base de um JSON “perfeito” é respeitar rigorosamente a sintaxe. Pode parecer trivial, mas muitos erros de produção nascem de detalhes que passam batido.

– Aspas duplas em chaves e strings: use sempre aspas duplas, nunca simples.
– Vírgulas: não deixe vírgula sobrando no último item de arrays e objetos.
– Nulos explícitos: diferencie chave ausente de chave presente com valor null.
– Codificação: garanta UTF-8 consistente, principalmente em integrações internacionais.
– Números: prefira números como números, não como strings; evite notação científica, a menos que seja requisito.

Uma regra útil: qualquer payload que seu serviço produz deve ser validável por um linter de JSON e ser parseado sem warnings pela biblioteca padrão na linguagem que você usa.

Tipagem consistente e coerência semântica

Em JSON, o tipo certo transmite intenção e permite validações precisas.

– Booleans para flags: evite “sim/não” ou “0/1” como strings.
– Inteiros vs. decimais: explicite quando um campo é money (decimal) versus quantity (inteiro).
– Datas e horas: padronize em ISO 8601 (por exemplo, 2025-11-04T13:45:00Z) e indique timezone.
– Identificadores: IDs como strings são mais seguros para não estourar limites de inteiros em clientes; documente o padrão (por exemplo, UUID v4).
– Arrays: use arrays mesmo para um item único se o modelo permitir múltiplos; não alterne entre objeto ou lista conforme a cardinalidade.

Coerência também é semântica. Se amount significa valor monetário, mantenha a mesma unidade e arredondamento em todo o sistema. Nada de misturar centavos em alguns lugares e unidades inteiras em outros sem deixar isso explícito.

Boas práticas antes de criar o esquema

Modelagem de domínio e contratos

Antes de abrir o editor para escrever json schema, alinhe o modelo de domínio. Um bom esquema nasce de um contrato claro entre produtor e consumidor.

– Defina casos de uso: quem consome? para quê? com que frequência?
– Identifique invariantes: o que sempre deve existir? o que é condicional?
– Liste campos opcionais com critérios: quando aparecem? qual o padrão quando ausentes?
– Mapeie relações: cardinalidade, composição, referências entre entidades.
– Antecipe evoluções: quais campos podem crescer? onde você espera novas variantes?

Uma técnica prática é escrever histórias de usuário do payload, criar exemplos realistas e revisá-los com stakeholders. Esses exemplos viram fixtures de testes mais tarde.

Convenções de nome e versionamento

Nomes consistentes melhoram a legibilidade e a manutenção do json schema.

– Estilo: prefira snake_case ou camelCase e nunca misture. Em APIs web, camelCase é mais comum.
– Prefixos claros: use sufixos como _id quando o campo for um identificador, e _at para timestamps.
– Vocabulário controlado: padronize termos como status, type, category para evitar sinônimos confusos.
– Versionamento: inclua versionamento no contrato (por exemplo, “schema_version”: 2) e no endpoint (v1, v2).
– Depreciação: marque campos a descontinuar e defina uma janela de coexistência.

Essas convenções evitam que o esquema vire um mosaico de exceções ao longo do tempo.

Construindo um json schema robusto

Campos obrigatórios, tipos e formatos

Um json schema forte é explícito e restritivo o bastante para capturar erros cedo, mas flexível o suficiente para evoluir.

– required: liste os campos sem os quais o payload não faz sentido.
– type: use os tipos adequados (string, number, integer, boolean, object, array).
– format: aproveite formatos padrão como date-time, email, uri, uuid, ipv4/ipv6.
– pattern: valide padrões como CEP, CPF/CNPJ, códigos internos.
– minimum/maximum e minLength/maxLength: previna valores fora de faixa e strings impraticáveis.
– enum: defina vocabulários fechados para status e tipos.
– default: documente valores padrão (ainda que a maioria das libs de validação não os insira automaticamente).

Dica prática: quanto mais específico você for, mais úteis serão as mensagens de erro. Prefira dividir campos (por exemplo, currency e amount) a ter um só campo polimórfico difícil de validar.

Reuso com $ref, allOf/anyOf/oneOf e padrões

Para evitar duplicação e garantir consistência, quebre seu json schema em componentes reutilizáveis.

– $ref: extraia Address, Money, UserRef e aponte para eles em vários lugares.
– allOf: combine esquemas para montar objetos por composição.
– anyOf/oneOf: modele variantes, como pagamento por cartão ou boleto, com regras exclusivas.
– patternProperties: valide chaves dinâmicas que seguem um padrão (tags, atributos livres).
– additionalProperties: restrinja objetos a chaves conhecidas quando necessário, ou permita extensões controladas.

Evite exageros: variantes em cadeia com oneOf mal especificadas podem gerar mensagens confusas. Documente com exemplos representativos para cada ramo.

Estratégias de validação no ciclo de desenvolvimento

Testes de contrato e desenvolvimento guiado por esquema

Coloque o json schema no centro do processo. Em vez de “validar no fim”, valide desde o início.

– Contratos versionados no repositório: trate o esquema como código, com revisão e histórico.
– Testes unitários e de integração: valide payloads de entrada e saída nos testes.
– Schemas gerados no CI: automatize a verificação de quebra de compatibilidade (breaking change).
– Consumer-driven contracts: consumidores adicionam exemplos e expectativas; produtores garantem compatibilidade.

Ferramentas como Ajv (Node.js), jsonschema (Python), Everit/Justify (Java) permitem validar em memória e reportar erros com precisão.

Observabilidade, logs e mensagens de erro úteis

Validação sem observabilidade não fecha o ciclo. Seus consumidores precisam saber exatamente o que corrigir.

– Mensagens detalhadas: inclua o caminho do campo, o valor recebido e a regra quebrada.
– Códigos de erro: padronize códigos para tipos de falhas (missing_required, invalid_format, out_of_range).
– Amostragem: não logue payloads completos de forma indiscriminada; respeite dados sensíveis.
– Dashboards: monitore taxas de rejeição por tipo de erro após releases.

Quanto mais rápido um consumidor vê o problema, menor o custo de suporte e correção.

Exemplos práticos de JSON “pronto para validar”

Exemplo 1: Cadastro de usuário

Objetivo: receber dados de um novo usuário com e-mail verificável e endereço opcional.

Exemplo de payload válido:
{
“user_id”: “c5b1db66-81a6-47d2-9d73-a5f9a7d4a1f1”,
“name”: “Ana Silva”,
“email”: “[email protected]”,
“phone”: “+55 11 91234-5678”,
“created_at”: “2025-11-04T13:45:00Z”,
“status”: “active”,
“address”: {
“street”: “Av. Paulista, 1000”,
“city”: “São Paulo”,
“state”: “SP”,
“postal_code”: “01310-100”,
“country”: “BR”
}
}

Características de “perfeição”:
– Tipos corretos: strings para IDs e datas, padrão ISO 8601 para created_at.
– Vocabulário fechado: status com enum (active, suspended, deleted).
– Campos opcionais claramente encapsulados: address ausente quando não informado.
– Padrões: postal_code com pattern de CEP brasileiro.

No json schema referente, defina required para user_id, name, email, created_at e status; email com format email; user_id com format uuid; address como objeto referenciado via $ref.

Exemplo 2: Evento de auditoria

Objetivo: rastrear ações de usuários com metadados de contexto.

Exemplo de payload válido:
{
“event_id”: “evt-20251104-000123”,
“occurred_at”: “2025-11-04T13:45:00Z”,
“actor”: {
“type”: “user”,
“id”: “c5b1db66-81a6-47d2-9d73-a5f9a7d4a1f1”
},
“action”: “document.uploaded”,
“resource”: {
“type”: “document”,
“id”: “doc_987654”
},
“metadata”: {
“ip”: “2001:0db8:85a3:0000:0000:8a2e:0370:7334”,
“user_agent”: “Mozilla/5.0”,
“tags”: [“upload”, “pdf”]
}
}

Boas práticas aplicadas:
– Nomes claros e consistentes: event_id, occurred_at, action.
– Formats específicos: uuid no actor.id, date-time em occurred_at, ipv6 em metadata.ip.
– Estrutura flexível com limites: metadata permite extensões, mas com tipos controlados.
– Domain events: action com enum ou pattern document.* para garantir nomenclatura.

O json schema pode usar patternProperties em metadata apenas para chaves que batam com um padrão conhecido (por exemplo, tags, ip, user_agent) e additionalProperties false para o restante, se quiser restringir.

Erros comuns que atrapalham a validação

Ambiguidade e sobrecarga de campos

Colocar significados demais em um único campo torna a validação frágil. Por exemplo, um status que carrega informações de erros e progressos simultaneamente dificulta regras claras. Divida em status e error_code, ou em status e progress.

Outro tropeço recorrente é alternar tipos de um mesmo campo. Um price que às vezes vem como número e às vezes como string quebra consumidores. Defina um tipo único e crie novos campos quando a necessidade for diferente (por exemplo, price_cents como integer e price como string formatada, se realmente preciso).

Variante mal modelada

Quando uma entidade possui múltiplas formas, explicite a discriminante. Em vez de tentar validar pagamento com cartão e boleto sem distinção, use um campo payment_method e oneOf com schemas específicos para card e boleto. Assim, a mensagem de erro aponta exatamente o ramo inválido.

Evite anyOf quando qualquer variante puder casar parcialmente. Prefira oneOf com discriminator e required adequados para impedir sobreposições confusas.

Compatibilidade e evolução sem dores

Backward compatibility como regra

Ao evoluir seu json schema, preserve compatibilidade com consumidores existentes.

– Adições não quebram: adicionar campos opcionais costuma ser seguro.
– Remoções quebram: planeje depreciação com janelas e comunicação.
– Restrições mais rígidas podem quebrar: aumentar minLength de 1 para 3, por exemplo, exige coordenação.
– Mude por versões: crie v2 do esquema quando alterações forem incompatíveis.

Documente quais mudanças são compatíveis e automatize a detecção de breaking changes no CI.

Versionamento e migração

Inclua um campo schema_version no payload ou versionamento no endpoint. Forneça scripts de migração ou adaptadores para consumidores que ainda não migraram. Em eventos, publique ambos os formatos por um período com chaves diferentes para permitir transição segura.

Ferramentas que ajudam a chegar à “perfeição”

Linters, validadores e geração de tipos

Ferramentas aceleram o caminho do conceito à produção.

– Ajv (Node.js): rápido, com suporte a drafts modernos e mensagens customizadas.
– Spectral: lint para contratos, útil em OpenAPI com referências a json schema.
– VS Code + extensões: valida esquemas em tempo real e sugere autocompletes.
– quicktype, jsonschema2pojo, dataclasses-json: geram modelos de código a partir do esquema.
– faker e json-schema-faker: geram dados sintéticos válidos para testes.

Integrar validação ao pipeline de CI traz confiança. Quebre o build quando um payload de exemplo não passar no esquema.

Documentação que os devs realmente usam

Uma documentação útil é tão importante quanto o próprio json schema.

– Exemplos válidos e inválidos: mostre o que passa e o que falha, com explicações.
– Campos com descrição: use o campo description no esquema para cada propriedade.
– Tabelas de enum: liste valores, significados e implicações.
– Fluxos e diagramas: contextualize como e quando o payload é produzido/consumido.

Quanto mais clara a documentação, menos suporte é necessário e mais rápida é a adoção.

Checklist rápido para um JSON pronto para validação

– Campos essenciais definidos em required.
– Tipos consistentes e formatos explícitos (date-time, email, uuid).
– Tamanhos e faixas controlados (minLength, maximum).
– Enums definidos para status e classificações.
– additionalProperties configurado conscientemente.
– Reuso com $ref para componentes comuns.
– Exemplos reais cobrindo cenários de sucesso e erro.
– Versionamento do contrato e política de depreciação documentada.
– Validação automática no CI e em runtime onde apropriado.
– Mensagens de erro claras e rastreáveis.

Perguntas frequentes rápidas

Quanto de restrição é demais?

Restrinja o suficiente para impedir dados inválidos e ambíguos, mas evite bloquear evoluções naturais. Em caso de dúvida, comece com regras mínimas e aumente a rigidez com base em incidentes e feedback.

Devo validar sempre em produção?

Sim, para entradas externas. Para outputs, valide pelo menos em ambientes de staging e em caminhos críticos, garantindo que regressões sejam detectadas antes que cheguem ao consumidor.

json schema substitui testes?

Não. Ele reduz a superfície de erro e formaliza contratos, mas testes de lógica e integração continuam essenciais. Use ambos: json schema para forma e testes para comportamento.

Do conceito à prática: sua próxima iteração

Criar um JSON “perfeito” não é obsessão por detalhes; é disciplina que evita bugs caros e integrações problemáticas. Ao colocar o json schema como contrato vivo, você transforma validação em um hábito automatizado, com feedback rápido e evoluções seguras. Use as boas práticas e exemplos deste guia como base para modelar, validar e documentar seus payloads.

Agora é sua vez: escolha um payload crítico do seu sistema, escreva ou refine o json schema correspondente e integre a validação no seu pipeline de CI. Em poucas horas, você verá o impacto direto na qualidade e na confiança das suas integrações.

https://www.youtube.com/watch?v=

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.