Integração e API

JSON Schema

2020‑12 é um dos drafts estáveis do JSON Schema e separa o vocabulário de validação do modelo de aplicação. Um schema declara tipos, propriedades, campos obrigatórios, enums, limites, formatos e composição por allOf, anyOf ou oneOf. Em APIs e automação, valida payloads antes de executar ações. O erro comum é tratá-lo como serializador ou contrato de semântica completa: ele valida a instância JSON, mas não garante unidade correta, autorização, frescor do dado nem efeito físico.


🔀 Tipos de Comunicação
Validation
Validação estrutural e de tipos
Keywords como type, properties, required, additionalProperties, minimum, maximum, pattern e enum descrevem quais instâncias são aceitas. Um comando de termostato pode exigir target_c entre 16 e 30, mode em heat, cool ou off e request_id em formato UUID. O validador deve usar o dialect declarado em $schema. Drafts possuem diferenças; uma keyword desconhecida pode ser ignorada em vez de falhar. Por isso, a versão precisa ser fixada. JSON distingue number, integer, string, boolean, object, array e null, mas não distingue int32 de int64. Formatos como date-time são anotações ou validações opcionais, conforme a implementação. O contrato deve testar o validador real. additionalProperties false reduz campos inesperados, porém dificulta evolução; unevaluatedProperties pode oferecer controle mais preciso em composição.
$ref/$defs
Referências e reutilização
$defs armazena schemas reutilizáveis, e $ref aponta a um URI ou fragmento. Identificadores com $id estabelecem base de resolução. Isso permite definir entidade, timestamp e qualidade uma vez. Referências podem ser locais, remotas ou empacotadas. Dependência remota em tempo de execução é arriscada: indisponibilidade ou alteração do schema quebra validação. Produção deve resolver e fixar versões. Referências circulares são permitidas em modelos recursivos, mas nem todas as ferramentas geram código bem. Em uma árvore de dispositivos, recursão pode ser adequada. Em payloads simples de IoT, prefira clareza. URLs de $id identificam; não precisam necessariamente ser buscadas, dependendo do resolver. Não use um endereço mutável para versões diferentes.
Composition
Composição e lógica condicional
allOf exige todos os subschemas; anyOf aceita um ou mais; oneOf exige exatamente um; not exclui. if/then/else aplica regras condicionais. Um dispositivo pode ter base comum e variantes por type. Se type é dimmer, brightness é obrigatório; se switch, brightness pode ser proibido. Composição melhora expressividade, mas pode gerar mensagens de erro complexas e schemas difíceis de manter. oneOf com variantes sobrepostas é fonte de falhas porque duas podem validar. Use discriminador explícito. allOf não é herança orientada a objetos e não mescla properties automaticamente; additionalProperties em um subschema pode bloquear campos de outro. Draft 2020‑12 e unevaluatedProperties ajudam, mas o autor precisa compreender avaliação.
Annotations
Anotações e documentação
title, description, default, examples, deprecated, readOnly e writeOnly documentam e alimentam interfaces. O validador normalmente não injeta default; a aplicação decide. Confundir default com valor automático gera divergência. readOnly e writeOnly são anotações usadas por OpenAPI e geradores, não uma política de acesso por si. Exemplos devem incluir unidade e casos de borda. A descrição precisa declarar semântica, como “temperatura do ar em °C, resolução 0,1 °C, UTC”. JSON Schema não possui unidade nativa universal; pode-se usar extensão ou objeto value/unit. A documentação deve distinguir valor ausente de null. Um campo nullable é representado por type [number, null] em JSON Schema puro.
Dialect
Metaschema, dialect e vocabulários
A keyword $schema identifica o metaschema e o dialect. Draft 2020‑12 organiza vocabulários de core, applicator, validation, unevaluated, format annotation e content. Implementações podem suportar subconjuntos. O metaschema valida a forma do schema, mas não prova que o modelo representa o domínio. Vocabulários customizados podem adicionar unidade, classificação ou políticas, porém reduzem portabilidade. Ferramentas que não conhecem a extensão podem ignorar. Em integrações de casa inteligente, extensões devem ser prefixadas, documentadas e evitadas no núcleo quando uma estrutura padrão resolve. A validação do schema em CI previne erros de keyword e referência.
✅ Vantagens Arquiteturais
Bloqueia payloads malformados antes de atingir dispositivos
Uma API pode rejeitar brightness 300, entity_id ausente ou um objeto no lugar de número. Isso reduz falhas e ataques triviais. A validação precisa ocorrer no limite de confiança: gateway, webhook e consumidor. Não basta validar no frontend. O erro deve apontar caminho e regra sem expor detalhes internos. Payloads também precisam de limite de tamanho e profundidade para evitar consumo excessivo. JSON Schema cobre estrutura, mas a aplicação ainda verifica autorização: um comando válido para fechadura continua proibido a usuário sem permissão. Validação e segurança são camadas separadas.
Gera modelos, formulários e documentação a partir de uma fonte comum
OpenAPI, AsyncAPI e ferramentas de UI usam schemas para criar clientes, tipos e formulários. Isso reduz duplicação. O resultado depende do subconjunto suportado. Recursos avançados de 2020‑12 podem não aparecer num gerador. Código gerado precisa de revisão. Um formulário pode usar enum para modos, minimum e maximum para slider. Defaults e labels ajudam. A interface não deve esconder unidade. A vantagem é alinhar implementação e documentação, desde que o schema seja versionado e testado. Alterar schema sem regenerar clientes produz incompatibilidade.
Permite testes de contrato e geração de casos
Testes podem validar exemplos, respostas e eventos. Geradores criam instâncias válidas e inválidas para fuzzing. A cobertura precisa incluir limites, campos extras, null, arrays vazios e strings longas. Um schema que só é testado com o exemplo feliz pode conter contradições. O CI deve validar o próprio schema e as instâncias. Em automação, testes impedem que atualização de integração mude temperature de number para string. Compatibilidade pode ser avaliada, mas é contextual: tornar campo opcional pode ser compatível para validação e incompatível para consumidores que o usam.
Favorece evolução explícita do modelo de dados
Campos novos opcionais, enums extensíveis e versões de schema permitem migração gradual. additionalProperties true facilita evolução, mas aceita erros de digitação; false detecta, mas exige coordenação. Uma estratégia é envelope com schema_version, núcleo estrito e metadata extensível. Consumidores devem ignorar campos desconhecidos quando o contrato permitir. Remover ou mudar tipo exige nova versão. O schema não executa transformação; adaptadores ou migrações fazem. Manter versões indefinidamente custa. A política de depreciação deve acompanhar. Para dispositivos offline por meses, a janela de compatibilidade precisa ser maior.
É independente de linguagem e amplamente integrado
Validadores existem para JavaScript, Python, Java, Go, Rust, .NET e outras linguagens. O mesmo documento pode ser usado em firmware de gateway, cloud e testes, embora microcontroladores possam não suportar todo o draft. Nesses casos, valida-se no gateway e implementa-se checagem mínima no dispositivo. A independência reduz divergência. A limitação é a diferença entre bibliotecas em format, regex, números e resolução remota. O projeto fixa biblioteca e versão e executa suite oficial quando possível. Regex segue ECMA‑262 no padrão, mas implementações podem variar.