Validatore JSON Schema
Valida JSON contro qualsiasi JSON Schema istantaneamente nel browser. Supporta Draft 2020-12, 2019-09 e Draft-07 con messaggi di errore con percorso preciso. 100% privato — nessun upload, nessun account, gratis.
Cos'è un Validatore JSON Schema?
Un validatore JSON Schema è un programma che prende due documenti JSON — un documento dati e un documento schema — e segnala se i dati rispettano il contratto dello schema. Lo schema dichiara tipi di campo, key required, range di valori, valori enum ammessi, pattern regex e regole strutturali tramite un vocabolario fisso (type, properties, required, items, enum, oneOf, allOf, $ref, format). Il validatore percorre entrambi i documenti in parallelo ed emette zero o più errori, ciascuno fissato a un percorso JSON Pointer all'interno dei dati.
La validazione viene eseguita a runtime, al confine tra l'input non fidato e il tuo codice. I tipi TypeScript scompaiono al tempo di compilazione e non possono aiutarti con JSON che arriva da un webhook, un'API di terze parti o un incolla utente — questo vuoto è esattamente ciò che JSON Schema riempie. Abbinalo a TypeScript (o Pydantic in Python) e ottieni garanzie a tempo di compilazione dentro la tua base di codice più garanzie a runtime al confine.
Draft 2020-12 è la specifica corrente e quella che dovresti scegliere per nuovi progetti nel 2026. Draft precedenti (2019-09, Draft-07, Draft-06, Draft-04) sopravvivono nelle basi legacy — Draft-07 è ancora comune nei chart Helm, nelle impostazioni di VS Code e nelle vecchie configurazioni Ajv. OpenAPI 3.1 usa Draft 2020-12 nativamente; OpenAPI 3.0 usa un sottoinsieme di Draft 4.
Questo strumento viene eseguito interamente nel browser. Il tuo JSON, il tuo schema e l'output della validazione non lasciano mai la tua macchina — sicuro per contratti API proprietari e payload sensibili. I puntatori $ref interni si risolvono automaticamente; i ref HTTP esterni sono intenzionalmente disabilitati per preservare la privacy.
Lavori con strumenti JSON correlati? Formatta il JSON con Formattatore JSON prima di incollare; confronta due documenti JSON con JSON Diff; converti con JSON to YAML e YAML to JSON. Per la validazione end-to-end in Node, Python e browser, consulta la nostra guida alla validazione JSON Schema.
// A 5-line schema that catches three real bugs
const schema = {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": { "type": "integer", "minimum": 1 },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "minimum": 0, "maximum": 150 }
},
"required": ["id", "email"],
"additionalProperties": false
};
// Three bugs the schema catches:
const bad = { "id": "42", "age": 200 };
// /id → type: expected integer, got string
// /email → required: missing
// /age → maximum: 200 > 150
// In Node: new Ajv().compile(schema)(bad) // false; ajv.errors has the paths
// In Python: jsonschema.validate(bad, schema)
// In the browser: this tool — same errors, same paths, no install Funzionalità principali
Supporto multi-Draft
Draft 2020-12 (predefinito), 2019-09 e Draft-07. Rileva automaticamente il draft dall'URI $schema; selettore di fallback per gli schemi che non lo hanno.
Errori con percorso preciso
Ogni errore include un JSON Pointer (es. /user/email/0), la keyword fallita (type, required, pattern) e un messaggio di una riga. Clicca per saltare alla posizione.
Validazione live
Valida mentre scrivi. Gli errori si aggiornano in tempo reale così iteri sullo schema o sui dati senza passare dai pulsanti Validate.
Copertura keyword format
email, uri, uuid, date, date-time, ipv4, ipv6, hostname, regex — i format che usi davvero, validati con pattern collaudati.
100% basato sul browser
Gli input non lasciano mai la tua macchina. Nessun upload, nessuna analisi su ciò che incolli, nessun localStorage del JSON. Sicuro per contratti proprietari e payload sensibili.
Schemi di esempio, un clic
Preset caricabili (form di registrazione, busta webhook, file di configurazione, array di ordini) ti portano a una validazione funzionante in meno di cinque secondi.
Esempi
Oggetto valido — required + tipi
{
"id": 42,
"email": "alice@example.com",
"age": 30
} {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": { "type": "integer", "minimum": 1 },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "minimum": 0, "maximum": 150 }
},
"required": ["id", "email"],
"additionalProperties": false
} Lo schema dichiara id ed email come required e fissa i tipi. I dati sopra superano la validazione — ogni vincolo è soddisfatto. Prova a rimuovere email o a cambiare id in stringa per vedere errori con percorso preciso.
Non valido — manca required + tipo errato
{
"id": "42",
"age": 200
} {
"type": "object",
"properties": {
"id": { "type": "integer" },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "maximum": 150 }
},
"required": ["id", "email"]
} Tre errori: /id è una stringa invece di un intero, /email manca, /age (200) supera maximum 150. Ogni errore riporta il percorso JSON Pointer esatto così puoi correggere i dati — o allentare lo schema — senza tirare a indovinare.
Unione discriminata — oneOf con const
{
"type": "order.created",
"data": { "orderId": "ORD-001234", "totalUsd": 49.99 }
} {
"oneOf": [
{
"properties": {
"type": { "const": "order.created" },
"data": {
"type": "object",
"properties": {
"orderId": { "type": "string", "pattern": "^ORD-[0-9]{6}$" },
"totalUsd": { "type": "number", "minimum": 0 }
},
"required": ["orderId", "totalUsd"]
}
},
"required": ["type", "data"]
},
{
"properties": {
"type": { "const": "order.refunded" },
"data": { "type": "object", "required": ["refundId"] }
},
"required": ["type", "data"]
}
]
} Validazione di una busta webhook. Il primo ramo di oneOf corrisponde perché type è "order.created". Cambia type in "order.refunded" o rompi il pattern di orderId per vedere come oneOf riporta i fallimenti per ramo.
Array di oggetti — items + uniqueItems
[
{ "sku": "A1", "qty": 3 },
{ "sku": "B2", "qty": 5 },
{ "sku": "A1", "qty": 3 }
] {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "object",
"properties": {
"sku": { "type": "string", "pattern": "^[A-Z][0-9]+$" },
"qty": { "type": "integer", "minimum": 1 }
},
"required": ["sku", "qty"]
}
} Due elementi sono identici byte per byte, quindi uniqueItems si attiva. Gli elementi 0 e 2 collidono — il validatore segnala il duplicato alla radice dell'array. Utile per intercettare duplicati di righe carrello e bug di merge in richieste di spedizione.
Come si usa
- 1
Incolla il tuo JSON Schema
Inserisci il tuo schema nel pannello destro. Il validatore rileva automaticamente il draft dall'URI $schema se presente; altrimenti scegli Draft 2020-12, 2019-09 o Draft-07 dalla toolbar.
- 2
Incolla i tuoi dati JSON
Inserisci il documento JSON che vuoi controllare nel pannello sinistro. La validazione si esegue mentre scrivi; gli input grandi (>200 KB) passano a un pulsante Validate manuale per mantenere la digitazione reattiva.
- 3
Leggi l'elenco degli errori
Ogni errore ha un percorso JSON Pointer, una keyword e un messaggio di una riga. Clicca su un errore per saltare alla posizione nei tuoi dati, correggilo e guarda il contatore scendere in tempo reale.
Trappole comuni di JSON Schema
Type: integer vs number
JSON Schema tratta 1.0 come number ma non come integer. Se il tuo contratto dice integer, il validatore rifiuta 1.0 — anche se la maggior parte dei linguaggi lo considera uguale a 1. Scegli number a meno che non ti serva davvero integer.
{ "qty": 1.0 } schema: { "type": "integer" } → error: not an integer { "qty": 1 } schema: { "type": "integer" } → valid required al livello di annidamento sbagliato
required deve stare accanto a properties, non dentro una proprietà. Un array required dentro la dichiarazione di una proprietà viene ignorato silenziosamente — il validatore non lo applica mai.
{ "properties": { "name": { "type": "string", "required": true } } } { "properties": { "name": { "type": "string" } }, "required": ["name"] } additionalProperties di default è true
Senza additionalProperties: false lo schema è aperto — ogni key extra passa. Dimenticarlo è il motivo più comune per cui gli schemi "accettano tutto".
{ "properties": { "id": { "type": "integer" } } } accepts: { "id": 1, "foo": "bar", "x": null } { "properties": { "id": { "type": "integer" } }, "additionalProperties": false } OpenAPI 3.0 nullable vs array di tipi Draft 2020-12
OpenAPI 3.0 usa nullable: true; Draft 2020-12 usa type: ["string", "null"]. Mescolarli produce schemi che sembrano corretti ma in realtà non permettono mai null.
{ "type": "string", "nullable": true } in 2020-12: nullable is just an unknown keyword { "type": ["string", "null"] } in 2020-12: explicitly allows null Pattern senza ancore
Il regex di JSON Schema corrisponde ovunque per default — pattern: "^[A-Z]+$" ancora a tutta la stringa, ma pattern: "[A-Z]+" corrisponde se esiste qualsiasi maiuscola in qualunque punto.
pattern: "[A-Z]+" accepts: "helloX" (because X matches)
pattern: "^[A-Z]+$" accepts only: "HELLO"
oneOf dove serviva anyOf
oneOf richiede che corrisponda esattamente un ramo. Se due rami accettano la stessa forma, oneOf fallisce su dati che anyOf accetterebbe — e il messaggio d'errore è confuso ("matches more than one").
oneOf: [ { type: "string" }, { type: "string", maxLength: 10 } ] on: "hi" → error: matches both anyOf: [ { type: "string" }, { type: "string", maxLength: 10 } ] on: "hi" → valid Casi d'uso comuni
- Validazione richiesta API
- Incolla un corpo di richiesta e lo schema del tuo endpoint prima del deploy. Intercetta le risposte 400 che i tuoi test non hanno coperto — campi required mancanti, tipi sbagliati, numeri fuori range.
- Verifica payload webhook
- Il vendor ha inviato un payload che il tuo handler rifiuta? Valida il payload reale contro il tuo schema, poi contro lo schema pubblicato del vendor. La differenza tra i due è il tuo bug.
- Linting di file di configurazione
- package.json, tsconfig.json, helm values.yaml — ogni file di configurazione ha uno schema pubblico. Incolla lo schema, incolla la configurazione, trova il typo. Salta il tentativi-ed-errori.
- Test componenti OpenAPI
- Estrai un componente di schema da un documento OpenAPI 3.1, incollalo qui, valida payload di esempio. Più veloce che tirare su un mock server, deterministico, nessun SDK richiesto.
- Pre-flight invio form
- Incolla un payload form di esempio prima di cablare la validazione frontend. Conferma che lo schema rifiuta ciò che ti aspetti, accetta ciò che ti aspetti, poi invia lo stesso schema a client e server.
- Verifica contratto pipeline dati
- L'output ETL è andato in deriva? Incolla una riga di esempio e lo schema a valle. Individua quale producer è cambiato e quali key si sono rotte prima che la pipeline ritenti 10.000 record.
Dettagli tecnici
- Conforme a Draft 2020-12
- Implementa la specifica Draft 2020-12 pubblicata — keyword, sistema di tipi, vocabolario format. Verificato contro l'output di Ajv 8.x e ajv-formats.
- Percorsi errore JSON Pointer
- Gli errori usano JSON Pointer RFC 6901 (/user/email/0). Ogni fallimento di keyword punta a una singola posizione risolvibile nei dati — nessuna ambiguità, nessuna ricerca per stringa.
- Risoluzione interna $ref
- Risolve i puntatori $ref all'interno di un singolo documento (#/$defs/foo, #/properties/bar). Cicli rilevati e segnalati. $ref HTTP esterni disabilitati per privacy.
Best Practice
- Imposta sempre additionalProperties: false
- Sui contratti di input (corpi di richiesta, file di configurazione, messaggi di coda) le key sconosciute sono di solito bug — typo, campi accidentali o sondaggi di un attaccante. Rifiutale per default.
- Usa $defs per sotto-schemi riutilizzabili
- Inlinare due volte la stessa forma porta a divergenza. Sposta le definizioni condivise in $defs e referenziale con $ref — un'unica fonte di verità, ogni modifica si applica ovunque.
- Valida prima della logica di business
- Esegui la validazione dello schema subito dopo JSON.parse, prima di toccare la struttura analizzata. Restringimento di tipo, default e persistenza presuppongono tutti che il contratto regga — assicurati che regga.
Domande frequenti
Cos'è la validazione JSON Schema?
Quali draft di JSON Schema supporta questo validatore?
Come valido JSON contro uno schema?
Qual è la differenza tra validazione JSON Schema e validazione di sintassi JSON?
Perché il mio schema rifiuta JSON che sembra corretto?
Supporta $ref e riferimenti remoti a schemi?
Cosa fa additionalProperties: false?
Come valido JSON contro uno schema in Node.js o Python?
Qual è la differenza tra oneOf, anyOf e allOf?
Supporta gli schemi OpenAPI?
Perché il validatore dice che il mio JSON Schema è esso stesso non valido?
Lo strumento invia il mio JSON o schema a un server?
Posso validare JSON Lines (NDJSON) o più documenti?
Strumenti correlati
Vedi tutti gli strumenti →Decodificatore e codificatore Base64
Codifica e formattazione
Decodifica e codifica Base64 online gratis. Conversione in tempo reale con pieno supporto UTF-8 ed emoji. 100% privato — gira nel tuo browser. Nessuna registrazione.
JSON Diff (Confronta)
Codifica e formattazione
Confronta due file JSON istantaneamente nel browser. Evidenziazione affiancata, output JSON Patch RFC 6902, ignora campi rumorosi come timestamp e ID. 100% privato, nessun upload.
Formattatore e Validatore JSON
Codifica e formattazione
Formatta, valida e abbellisci JSON direttamente nel browser. Strumento online gratuito con controllo sintassi, rilevamento errori, minifica e copia in un clic. 100% privato.
Convertitore JSON in YAML
Codifica e formattazione
Incolla JSON e ottieni YAML istantaneamente nel browser. Conversione live, K8s e Compose, rientro 2/4 spazi, virgolette Norway-safe. 100% privato.
Generatore QR Code — URL, WiFi, vCard, Email, SMS, Geo
Codifica e formattazione
Generatore di QR code gratuito. Crea QR code statici per URL, WiFi, vCard, email e SMS. Download SVG e PNG. Senza scadenza, senza registrazione, 100% nel tuo browser.
Codificatore e Decodificatore URL con Parser URL Integrato
Codifica e formattazione
Decodifica o codifica URL in tempo reale con parser URL integrato. Doppia modalità: encodeURI e encodeURIComponent. 100% privato, nessun dato inviato a server online.