Gerador de Esquema JSON

Cole uma ou várias amostras JSON e o gerador infere um Esquema JSON que você pode usar para validar novas cargas. Detecta tipos, marca campos como obrigatórios quando aparecem em todas as amostras, infere enums quando os valores são extraídos de um pequeno conjunto fechado e produz uma saída conforme o rascunho do Esquema JSON 2020-12.

Como gerar um Esquema JSON

  1. 1

    Cole documentos de amostra

    Uma ou várias cargas reais, quanto mais variedade, mais preciso será o esquema inferido.

  2. 2

    Escolha o rascunho

    Rascunho 2020-12 (atual), rascunho 07 (amplamente suportado) ou rascunho 04 (legado OpenAPI).

  3. 3

    Ajuste a inferência

    Ative a inferência de enum, estratégia de campos obrigatórios (interseção vs união) e se deve marcar todos os campos como `obrigatórios` quando apenas uma amostra é fornecida.

  4. 4

    Gerar

    O esquema é emitido com `$schema`, `title`, `type`, `properties` e `$ref`s aninhados para sub-objetos repetidos.

O que a inferência faz bem

  • Tipos: string, número, inteiro, booleano, nulo, array, objeto.
  • Nulidade: um campo que é nulo em uma amostra e uma string em outra se torna ["string", "null"].
  • Itens de array: arrays homogêneos produzem um único esquema de items; arrays heterogêneos produzem prefixItems.
  • Enumerações (enum): se todos os valores observados são de um pequeno conjunto (configurável, padrão 10 valores distintos), emite um enum.
  • Obrigatório: com várias amostras, a interseção de chaves se torna obrigatório; com uma amostra, todas as chaves são obrigatórias, a menos que você opte por não incluir.
  • Formatos: strings que correspondem a datas ISO-8601, e-mails ou URIs recebem um formato inferido.

O que a inferência não pode saber

  • Intenção vs exemplo: uma amostra age: 25 infere type: integer, mas não pode saber que você também aceita nulo. Passe várias amostras que cubram casos extremos.
  • Restrições: minLength, maximum, pattern, você precisa adicionar isso manualmente. A inferência não adivinha limites a partir das amostras.
  • Lógica de negócios: “exatamente um desses três campos deve ser definido” requer oneOf, não é inferível.
  • Referências: o gerador emite um esquema plano. Se você quiser fatorar formas repetidas em $defs, faça isso após a geração.

Exemplo de saída

A partir de uma única amostra:

{ "name": "Alice", "age": 30, "tags": ["admin", "user"] }

O esquema inferido (rascunho 2020-12):

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "integer" },
    "tags": { "type": "array", "items": { "type": "string" } }
  },
  "required": ["name", "age", "tags"]
}

Erros comuns

  • Inferindo a partir de uma amostra. O esquema ficará superajustado, cada campo se torna obrigatório, sem tolerância a nulos. Sempre forneça pelo menos 5-10 amostras variadas.
  • Usando integer quando você quis dizer number. Se alguma amostra tiver um decimal, o tipo inferido se torna number; se todas forem inteiras, se torna integer. Para campos que podem ser ambos, inclua uma amostra decimal.
  • Esquecendo campos opcionais. Um campo presente em 4 de 5 amostras, mas ausente em 1, se torna opcional, intencional. Se todas as 5 amostras incluírem, o esquema o marcará como obrigatório, mesmo que seja realmente opcional na sua API.

Perguntas frequentes

Quanto mais, melhor, mas 5-10 amostras variadas geralmente produzem um esquema razoável. Com uma amostra, cada campo se torna obrigatório e a nulidade não pode ser inferida, sempre forneça várias variantes se puder.

Rascunho 2020-12 por padrão. Rascunhos 07 e 04 estão disponíveis para compatibilidade com OpenAPI 3.0 (que usa um subconjunto do rascunho 05/07).

Não. Inferir restrições sensatas a partir de amostras superajustaria o esquema. Adicione minLength, maximum, pattern etc. manualmente após a geração com base nas suas regras de negócios.

Sim. Se você colar um array JSON, o gerador trata cada elemento como uma amostra separada e produz um esquema descrevendo um elemento individual, não o array externo. Ative “tratar como contêiner de array” se você quiser a forma do array externo.

Ferramentas relacionadas

Ferramenta disponível em outros idiomas