100 % local — seus dados nunca saem do seu navegador

JSON para JSON Schema — um contrato para a CI

Transforme uma amostra JSON num JSON Schema, draft 2020-12. Chaves obrigatórias e additionalProperties são interruptores: o contrato diz o que você quer.

Instantâneo Privado Zero cookies
Indentação

Entrada JSON

Saída JSON Schema

O que esta ferramenta faz

Uma amostra JSON vira um JSON Schema no draft 2020-12.

{ "id": 1, "name": "Ada", "address": { "city": "Paris" } }
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": { "type": "integer" },
    "name": { "type": "string" },
    "address": {
      "type": "object",
      "properties": { "city": { "type": "string" } },
      "required": ["city"]
    }
  },
  "required": ["id", "name", "address"]
}

Os objetos aninhados são escritos no lugar. Sem seção $defs e sem $ref: para uma amostra, um esquema em linha é o que se lê de cima a baixo.

Dois ajustes, porque as duas respostas se defendem

  • Chaves obrigatórias. Ligado por padrão: cada chave da amostra fica listada. Desligado: nenhum array required, e um documento sem uma chave valida assim mesmo.
  • additionalProperties. Permissivo por padrão — uma chave a mais passa. No estrito, "additionalProperties": false é acrescentado a cada objeto e uma chave inesperada vira erro.

Nenhuma das duas escolhas se lê numa amostra. São afirmações sobre a sua API: cabem a você, em vez de serem adivinhadas aqui.

integer e number vêm do literal

3 dá integer; 3.0 e 1e3 dão number. O JSON tem um único tipo numérico: como um número foi escrito é o único rastro do que o produziu. Um esquema que chame 10.0 de inteiro recusa 10.5, muito provavelmente o registro seguinte — era exatamente o que esta ferramenta fazia até o defeito ser encontrado e corrigido ao escrever estas páginas.

O que a amostra não descreve

  • "n": null dá {"type": "null"}, um esquema que não aceita mais nada. Se o campo for uma string anulável, o retoque é {"type": ["string", "null"]}.
  • Um array vazio dá {"type": "array"} sem items: nada se afirma sobre elementos que nunca apareceram.
  • Um array heterogêneo dá anyOf, listando exatamente as formas presentes.
  • Nem format, nem minLength, nem pattern. Um e-mail, um UUID e uma frase são todos "type": "string" aqui. Acrescentar "format": "email" seria adivinhar um sentido, não ler uma estrutura — e é a primeira coisa a acrescentar à mão quando você conhece o campo.

Privado por padrão

Tudo é executado localmente no seu navegador com JavaScript. Os seus dados nunca são enviados para um servidor, o que torna a ferramenta segura para conteúdo sensível e funciona offline.

Perguntas frequentes

Por que está tudo em `required`?
Porque todas as chaves estavam na amostra, e é a única afirmação que o documento sustenta. É também um ajuste: desligue-o e nenhum array `required` é emitido. Deixá-lo ligado dá um esquema que falha alto diante de uma chave ausente, em geral o melhor ponto de partida.
Por que não há seção `$defs`?
Porque o esquema vai em linha: os objetos aninhados são escritos onde aparecem, mesmo que a mesma forma volte duas vezes. Lê-se melhor para uma amostra e valida igual. Se você está fatorando um esquema grande, mover os subesquemas repetidos para `$defs` com `$ref` é um retoque que compensa.
O que decide entre `integer` e `number`?
O literal. `3` dá `integer`, `3.0` e `1e3` dão `number`, porque o JSON tem um único tipo numérico e a forma escrita é o único testemunho do original. Um esquema que chamasse `10.0` de inteiro recusaria `10.5` — o registro seguinte — e era o que esta ferramenta fazia até ser corrigida.

Conversores relacionados