100 % locale — i tuoi dati non lasciano mai il tuo browser

JSON in JSON Schema — un contratto per la CI

Trasforma un campione JSON in un JSON Schema, draft 2020-12. Chiavi obbligatorie e additionalProperties sono interruttori: il contratto dice ciò che vuoi.

Istantaneo Privato Zero cookie
Indentazione

Input JSON

Output JSON Schema

Che cosa fa questo strumento

Un campione JSON diventa uno JSON Schema in 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"]
}

Gli oggetti annidati sono scritti sul posto. Nessuna sezione $defs, nessun $ref: per un campione, uno schema in linea è quello che si legge dall’alto in basso.

Due impostazioni, perché entrambe le risposte si difendono

  • Chiavi obbligatorie. Attiva per default: ogni chiave del campione è elencata. Disattiva: nessun array required, e un documento privo di una chiave valida lo stesso.
  • additionalProperties. Permissivo per default: una chiave in più passa. In stretto, "additionalProperties": false è aggiunto a ogni oggetto e una chiave inattesa è un errore.

Nessuna delle due scelte si legge in un campione. Sono affermazioni sulla tua API: spettano a te, invece di essere indovinate qui.

integer e number vengono dal letterale

3 dà integer; 3.0 e 1e3 danno number. JSON ha un solo tipo numerico: il modo in cui un numero è scritto è l’unica traccia di ciò che l’ha prodotto. Uno schema che chiama intero 10.0 rifiuta 10.5, con ogni probabilità il record successivo — è esattamente ciò che questo strumento faceva finché il difetto non è stato trovato e corretto scrivendo queste pagine.

Ciò che il campione non descrive

  • "n": null dà {"type": "null"}, uno schema che non accetta altro. Se il campo è una stringa annullabile, la modifica è {"type": ["string", "null"]}.
  • Un array vuoto dà {"type": "array"} senza items: non si afferma nulla su elementi mai visti.
  • Un array eterogeneo dà anyOf, elencando esattamente le forme presenti.
  • Né format, né minLength, né pattern. Un’email, un UUID e una frase sono qui tutti "type": "string". Aggiungere "format": "email" sarebbe indovinare un significato, non leggere una struttura — ed è la prima cosa da aggiungere a mano quando conosci il campo.

Privato per progettazione

Tutto viene eseguito localmente nel browser con JavaScript. I tuoi dati non vengono mai caricati, quindi lo strumento è sicuro per contenuti sensibili e funziona anche offline.

Domande frequenti

Perché è tutto in `required`?
Perché ogni chiave era nel campione, ed è l’unica affermazione che il documento sostiene. È anche un’impostazione: disattivala e nessun array `required` viene emesso. Lasciarla attiva dà uno schema che fallisce rumorosamente su una chiave mancante, di solito il punto di partenza più utile.
Perché non c’è una sezione `$defs`?
Perché lo schema è in linea: gli oggetti annidati stanno dove compaiono, anche se la stessa forma torna due volte. Per un campione si legge meglio e valida allo stesso modo. Se stai fattorizzando uno schema grande, spostare i sottoschemi ripetuti in `$defs` con `$ref` è una modifica che conviene.
Che cosa distingue `integer` da `number`?
Il letterale. `3` dà `integer`, `3.0` e `1e3` danno `number`, perché JSON ha un solo tipo numerico e la forma scritta è l’unica testimonianza dell’originale. Uno schema che chiamasse intero `10.0` rifiuterebbe `10.5` — il record successivo — ed è ciò che questo strumento faceva prima della correzione.

Convertitori correlati