Gerador de esquema JSON

Cole JSON para gerar automaticamente um JSON Schema.

Nenhum dado sai do seu dispositivo

Como usar

  1. Cole um objeto ou um array JSON na área de entrada.
  2. Ative as opções : incluir os arrays « required » ou os « examples » oriundos dos seus valores.
  3. Clique em Gerar o schema para criar um JSON Schema (Draft 2020-12).
  4. Copie ou baixe o schema gerado.

Perguntas frequentes

Qual versão de JSON Schema é gerada ?

O gerador produz JSON Schema Draft 2020-12 (https://json-schema.org/draft/2020-12/schema), o último draft estável.

Ele lida com objetos e arrays aninhados ?

Sim. O gerador trata recursivamente objetos e arrays aninhados. Para arrays, ele infere o schema a partir do primeiro elemento.

Posso editar o schema gerado ?

A saída é um ponto de partida. Você talvez queira adicionar restrições como minLength, minimum, pattern ou enum conforme as suas necessidades.

Para que serve o JSON Schema

JSON Schema é uma forma declarativa de descrever como deve ser um documento JSON: que propriedades tem, que tipos essas propriedades guardam, o que é obrigatório versus opcional e que valores são válidos. É o equivalente do mundo JSON ao XSD para XML ou a uma definição de tabela de base de dados. O projecto oficial vive em json-schema.org.

Onde o vai encontrar:

Os drafts que vai ver por aí

A especificação do JSON Schema foi publicada como uma série de drafts. O draft estável actual é o 2020-12 (segundo a página oficial da spec: «The current version is 2020-12»). Os drafts que pode encontrar:

Em caso de dúvida, escolha o draft que corresponda ao seu validador. O AJV (o validador JavaScript mais popular) suporta os Drafts 04, 06, 07, 2019-09 e 2020-12 com opt-in explícito. O jsonschema em Python faz o mesmo. Se não sabe o que o seu consumidor a jusante quer, 2020-12 é um padrão seguro para trabalho novo.

Os tipos embutidos

O JSON Schema descreve sete tipos base correspondentes às espécies de valor do JSON:

tipoValor JSONPalavras-chave comuns
string"hello"minLength, maxLength, pattern, format
number42, 3.14minimum, maximum, exclusiveMinimum, multipleOf
integer42Subconjunto de number; sem componente fraccionária.
booleantrue / falseSem restrições adicionais.
nullnullTipo distinto; explícito quando os nulls são válidos.
array[…]items, minItems, maxItems, uniqueItems
object{…}properties, required, additionalProperties

As palavras-chave de composição permitem-lhe misturar e combinar: oneOf (exactamente um), anyOf (pelo menos um), allOf (todos), not (o inverso). Mais enum para uma lista finita de valores permitidos e const para um único valor fixo.

O que um schema autogerado pode e não pode dizer-lhe

Inferir um schema a partir de um único exemplo JSON é poderoso mas limitado. O gerador consegue detectar:

Não consegue detectar:

Trate a saída como um ponto de partida a 70%. As adições valiosas (que campos são realmente obrigatórios, que formatos de string aplicam-se, que intervalos de valor são permitidos, o que cada campo significa) são a fase de curadoria humana.

Duas armadilhas subtis que vale a pena conhecer

JSON Schema vs Zod / Joi / Yup vs tipos TypeScript

Várias tecnologias sobrepõem-se ao papel do JSON Schema; cada uma tem um sweet spot diferente:

Se o seu schema precisa de ser consumido por várias linguagens ou por ferramentas (IDEs, tooling de OpenAPI, geradores de código), JSON Schema é o lar certo. Se fica dentro de uma só linguagem, a opção nativa dessa linguagem é geralmente mais agradável de escrever.

Casos de uso comuns

Erros comuns

  1. Tratar o schema autogerado como a spec final. É um ponto de partida. Adicione pistas de formato, marque campos genuinamente opcionais, adicione documentação, defina intervalos de valor.
  2. Falhar a declaração $schema. Os validadores usam-na para saber que draft aplicar. Inclua-a sempre no topo do schema.
  3. Tratar required como um atributo por propriedade. Ao contrário do XSD ou dos schemas Mongoose, o required do JSON Schema é um array ao nível do objecto pai a listar os nomes das propriedades obrigatórias.
  4. Esquecer-se de additionalProperties: false quando quer validação estrita. O default é true, ou seja, chaves desconhecidas são silenciosamente permitidas.
  5. Confundir enum com examples. enum = a lista de valores permitidos (validação). examples = valores de amostra apenas para documentação (sem efeito de validação).
  6. Assumir que format é aplicado. Por defeito em Draft 2020-12 é uma anotação, não uma asserção; a sua regex de email não corre a menos que opte por isso.
  7. Inferir opcionalidade a partir de um único exemplo. Cada chave do seu exemplo torna-se obrigatória por defeito. Specs reais quase sempre têm campos opcionais; remova-os do array required como parte da curadoria.

Mais perguntas frequentes

O schema vai funcionar com OpenAPI 3.1?

Sim. O OpenAPI 3.1 (lançado em Fevereiro de 2021) alinhou completamente a sua linguagem de schema com o JSON Schema Draft 2020-12, que é o que este gerador emite. Coloque o schema em components.schemas no seu documento OpenAPI e referencie-o via $ref. O OpenAPI 3.0 mais antigo usava um subconjunto anterior; pode precisar de ajustar se está a apontar para 3.0.

Posso gerar tipos na minha linguagem a partir deste schema?

Sim. quicktype gera TypeScript, Go, Python, Java, C#, Swift, Kotlin, Rust, Elm e outros a partir de um JSON Schema. json-schema-to-typescript é uma alternativa específica para JS. A maior parte das linguagens modernas tem pelo menos uma ferramenta schema-para-tipos; o schema gerado funciona como input para todas elas.

Qual a diferença entre $defs e definitions?

Ambos são sítios para colocar sub-schemas reutilizáveis que pode $referenciar noutro lado do documento. definitions é o nome legacy, usado nos Drafts 04, 06 e 07. $defs é o nome actual, introduzido no Draft 2019-09 e a continuar em 2020-12. Funcionalmente equivalentes, mas use $defs para trabalho novo.

O meu JSON é enviado para algum sítio?

Não. A geração de schema corre inteiramente no seu navegador. O JSON colado é parsed localmente, percorrido e emitido como um schema na textarea de saída. Nada é enviado para um servidor, registado ou guardado depois de fechar o separador. Isto importa porque os exemplos JSON contêm muitas vezes dados reais (registos de cliente, respostas de API internas, info de funcionários) que não quer que passem por um terceiro.

Por que é que o schema do meu array só descreveu o primeiro elemento?

A inferência a partir de um único exemplo trata os arrays como homogéneos: olha para o primeiro elemento e assume que o resto corresponde. Se o seu array real pode conter formas diferentes, vai precisar de escrever os items como { "oneOf": [...] } à mão. Ou correr o gerador em cada variante separadamente e combinar os schemas.

Devo usar um gerador, ou escrever o schema à mão?

Para um schema pequeno que controla de ponta a ponta, escrever à mão ensina-lhe a spec mais depressa. Para uma resposta de API grande com dezenas de objectos aninhados, gerar leva-o a um rascunho em segundos e gasta o tempo poupado a curar restrições, descrições e arrays required. A maior parte dos programadores em activo faz ambas: gerar, depois curar.

Ferramentas relacionadas

Formatador e validador JSON gratuito on-line Comparador JSON JSON para YAML