Skip to content

JSON Schema-validator

Valideer JSON tegen elk JSON Schema direct in je browser. Ondersteunt Draft 2020-12, 2019-09 en Draft-07 met padnauwkeurige foutmeldingen. 100% privé — geen upload, geen account, gratis.

Geen tracking Draait in je browser Gratis
Plak zowel JSON-data als een schema
Reviewed for Draft 2020-12, 2019-09, and Draft-07 compliance, including type coercion edge cases, format vocabulary, $ref resolution, and JSON Pointer error paths. — Go Tools API Tooling Team · May 7, 2026

Wat is een JSON Schema Validator?

Een JSON Schema Validator is een programma dat twee JSON-documenten neemt — een datadocument en een schemadocument — en rapporteert of de data voldoet aan het contract van het schema. Het schema verklaart veldtypes, required-keys, waardebereiken, toegestane enum-waarden, regex-patterns en structuurregels via een vast vocabulaire (type, properties, required, items, enum, oneOf, allOf, $ref, format). De validator doorloopt beide documenten parallel en geeft nul of meer fouten, elk vastgepind op een JSON Pointer-pad in de data.

Validatie draait op runtime, op de grens tussen onbetrouwbare invoer en je code. TypeScript-types verdwijnen op compile-time en kunnen niet helpen bij JSON die binnenkomt via een webhook, een externe API of een gebruikersplaksessie — precies dat gat vult JSON Schema. Combineer het met TypeScript (of Pydantic in Python) en je krijgt compile-time-garanties binnen je codebase plus runtime-garanties op de grens.

Draft 2020-12 is de huidige spec en de juiste keuze voor nieuwe projecten in 2026. Eerdere drafts (2019-09, Draft-07, Draft-06, Draft-04) leven voort in legacy-codebases — Draft-07 is nog gebruikelijk in Helm-charts, VS Code-settings en oudere Ajv-configuraties. OpenAPI 3.1 gebruikt Draft 2020-12 ingebouwd; OpenAPI 3.0 gebruikt een Draft 4-subset.

Deze tool draait volledig in je browser. Je JSON, je schema en de validatie-uitvoer verlaten je machine nooit — veilig voor proprietaire API-contracten en gevoelige payloads. Interne $ref-pointers lossen automatisch op; externe HTTP-refs zijn bewust uitgeschakeld voor de privacy.

Aan het werk met aangrenzende JSON-tools? Formatteer JSON met de JSON Formatter voor je hier plakt; vergelijk twee JSON-documenten met JSON Diff; converteer met JSON naar YAML en YAML naar JSON. Voor end-to-end-validatie in Node, Python en de browser, zie onze gids voor JSON Schema-validatie.

// 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

Belangrijkste functies

Multi-draftondersteuning

Draft 2020-12 (standaard), 2019-09 en Draft-07. Detecteert de draft automatisch via de $schema-URI; fallback-keuzeknop voor schema's zonder URI.

Padnauwkeurige fouten

Elke fout bevat een JSON Pointer (bijv. /user/email/0), het falende keyword (type, required, pattern) en een eenregelige boodschap. Klik om naar de plek te springen.

Live validatie

Valideert terwijl je typt. Fouten verversen real-time, dus je itereert op het schema of de data zonder een knop te hoeven gebruiken.

Dekking van format-keywords

email, uri, uuid, date, date-time, ipv4, ipv6, hostname, regex — de formats die je echt gebruikt, gevalideerd met beproefde patterns.

100% browsergebaseerd

Invoer verlaat je machine nooit. Geen upload, geen analytics op wat je plakt, geen localStorage van JSON. Veilig voor proprietaire contracten en gevoelige payloads.

Voorbeeldschema's, één klik

Laadbare presets (signup-formulier, webhook-envelope, configuratiebestand, array van orders) brengen je in onder de vijf seconden naar een werkende validatie.

Voorbeelden

Geldig object — required + types

{
  "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
}

Het schema verklaart id en email als required en legt types vast. Bovenstaande data is geldig — aan elke regel is voldaan. Verwijder email of zet id om naar een string om padnauwkeurige fouten te zien.

Ongeldig — required ontbreekt + verkeerd type

{
  "id": "42",
  "age": 200
}
{
  "type": "object",
  "properties": {
    "id": { "type": "integer" },
    "email": { "type": "string", "format": "email" },
    "age": { "type": "integer", "maximum": 150 }
  },
  "required": ["id", "email"]
}

Drie fouten: /id is een string in plaats van integer, /email ontbreekt, /age (200) overschrijdt maximum 150. Elke fout meldt het exacte JSON Pointer-pad — zo corrigeer je de data of versoepel je het schema zonder gokken.

Discriminated union — oneOf met 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"]
    }
  ]
}

Validatie van een webhook-envelope. De eerste oneOf-tak past omdat type "order.created" is. Zet type op "order.refunded" of breek het orderId-pattern om te zien hoe oneOf per tak rapporteert.

Array van objecten — 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"]
  }
}

Twee items zijn byte-identiek, dus uniqueItems slaat aan. Item 0 en 2 botsen — de validator meldt het duplicaat in de array-root. Handig om dubbele winkelwagenregels en merge-bugs in verzendaanvragen op te sporen.

Gebruiksaanwijzing

  1. 1

    Plak je JSON Schema

    Zet je schema in het rechterpaneel. De validator detecteert de draft automatisch via de $schema-URI als die er is; anders kies je Draft 2020-12, 2019-09 of Draft-07 in de werkbalk.

  2. 2

    Plak je JSON-data

    Zet het te controleren JSON-document in het linkerpaneel. Validatie draait terwijl je typt; grote invoer (>200 KB) schakelt over op een handmatige Valideren-knop zodat het tikken vlot blijft.

  3. 3

    Lees de foutenlijst

    Elke fout heeft een JSON Pointer-pad, een keyword en een eenregelige boodschap. Klik op een fout om naar de plek in je data te springen, los hem op en zie het aantal real-time dalen.

Veelvoorkomende JSON Schema-valkuilen

Type: integer vs number

JSON Schema beschouwt 1.0 als number, maar niet als integer. Zegt je contract integer, dan wijst de validator 1.0 af — ook al noemen de meeste talen het gelijk aan 1. Kies number tenzij je echt integer nodig hebt.

✗ Fout
{ "qty": 1.0 }   schema: { "type": "integer" }   → error: not an integer
✓ Correct
{ "qty": 1 }     schema: { "type": "integer" }   → valid

required op verkeerd nestelniveau

required moet naast properties staan, niet erbinnen. Een required-array binnen een propertydeclaratie wordt stilzwijgend genegeerd — de validator dwingt het nooit af.

✗ Fout
{ "properties": { "name": { "type": "string", "required": true } } }
✓ Correct
{ "properties": { "name": { "type": "string" } }, "required": ["name"] }

additionalProperties is standaard true

Zonder additionalProperties: false is het schema open — elke extra key gaat erdoor. Dit vergeten is de voornaamste reden dat schema's „alles accepteren".

✗ Fout
{ "properties": { "id": { "type": "integer" } } }   accepts: { "id": 1, "foo": "bar", "x": null }
✓ Correct
{ "properties": { "id": { "type": "integer" } }, "additionalProperties": false }

OpenAPI 3.0 nullable vs Draft 2020-12 type-array

OpenAPI 3.0 gebruikt nullable: true; Draft 2020-12 gebruikt type: ["string", "null"]. Ze mengen levert schema's op die er goed uitzien maar nooit echt null toelaten.

✗ Fout
{ "type": "string", "nullable": true }   in 2020-12: nullable is just an unknown keyword
✓ Correct
{ "type": ["string", "null"] }   in 2020-12: explicitly allows null

Pattern zonder anchors

JSON Schema-regex matcht standaard ergens — pattern: "^[A-Z]+$" verankert op de hele string, maar pattern: "[A-Z]+" matcht zodra ergens een hoofdletter staat.

✗ Fout
pattern: "[A-Z]+"   accepts: "helloX"   (because X matches)
✓ Correct
pattern: "^[A-Z]+$"   accepts only: "HELLO"

oneOf waar anyOf bedoeld werd

oneOf verlangt dat precies één tak matcht. Accepteren twee takken dezelfde vorm, dan faalt oneOf op data die anyOf zou laten passeren — en de foutmelding is verwarrend ("matches more than one").

✗ Fout
oneOf: [ { type: "string" }, { type: "string", maxLength: 10 } ]   on: "hi"   → error: matches both
✓ Correct
anyOf: [ { type: "string" }, { type: "string", maxLength: 10 } ]   on: "hi"   → valid

Veelvoorkomende gebruikssituaties

API-requestvalidatie
Plak een request body en het schema van je endpoint vóór de deploy. Vang 400-responses op die je tests niet dekten — ontbrekende required-velden, verkeerde types, getallen buiten bereik.
Webhook-payloadverificatie
Stuurde de leverancier een payload die je handler weigert? Valideer de werkelijke payload tegen je schema, en daarna tegen het gepubliceerde schema van de leverancier. Het verschil tussen die twee is je bug.
Configuratiebestandlinting
package.json, tsconfig.json, helm values.yaml — elk configuratiebestand heeft een publiek schema. Schema plakken, configuratie plakken, typefout vinden. Geen trial-and-error meer.
OpenAPI-componenttest
Til een schemacomponent uit een OpenAPI 3.1-document, plak hem hier en valideer voorbeeldpayloads. Sneller dan een mockserver opspinnen, deterministisch, geen SDK nodig.
Pre-flight voor formulierinzending
Plak een voorbeeld-formulierpayload voor je de frontendvalidatie aansluit. Bevestig dat het schema afwijst wat je verwacht en accepteert wat je verwacht — en lever daarna hetzelfde schema aan client én server.
Datapipelinecontract-controle
ETL-uitvoer gedrift? Plak een voorbeeldrij en het downstream-schema. Zoek uit welke producer veranderde en welke keys braken voordat de pipeline 10.000 records opnieuw probeert.

Technische details

Draft 2020-12-conform
Implementeert de gepubliceerde Draft 2020-12-spec — keywords, typesysteem, format-vocabulaire. Dubbel gecontroleerd tegen Ajv 8.x en de uitvoer van ajv-formats.
JSON Pointer-foutpaden
Fouten gebruiken RFC 6901 JSON Pointer (/user/email/0). Elke keywordfout wijst naar één oplosbare plek in de data — geen ambiguïteit, geen string-search.
Interne $ref-resolutie
Lost $ref-pointers binnen één document op (#/$defs/foo, #/properties/bar). Cycli worden gedetecteerd en gerapporteerd. Externe HTTP $refs uitgeschakeld voor de privacy.

Aanbevolen aanpak

Zet altijd additionalProperties: false
Bij invoercontracten (request bodies, configuratiebestanden, queueberichten) zijn onbekende keys meestal bugs — typefouten, per ongeluk toegevoegde velden of aanvallers die aftasten. Standaard afwijzen.
Gebruik $defs voor herbruikbare subschema's
Inline dezelfde vorm twee keer en ze drijven uit elkaar. Zet gedeelde definities in $defs en refereer met $ref — één bron van waarheid, elke wijziging werkt overal door.
Valideer voor de businesslogica
Voer schemavalidatie meteen na JSON.parse uit, voordat je de geparseerde structuur aanraakt. Type-narrowing, defaults en persistentie gaan er allemaal van uit dat het contract houdt — zorg dat dat zo is.

Veelgestelde vragen

Wat is JSON Schema-validatie?
JSON Schema-validatie controleert of een JSON-document voldoet aan een contract dat in JSON Schema-syntax is geschreven. Het schema verklaart veldtypes, required-keys, toegestane waarden en structuurregels; de validator loopt beide documenten parallel door en meldt elk pad dat het contract schendt. Het draait op de grens tussen onbetrouwbare invoer (API-request, webhook, configuratiebestand, formulierpayload) en je businesslogica — vormfouten worden afgevangen voordat ze nageschakelde code corrumperen. Zie onze complete gids voor JSON Schema-validatie met end-to-end-voorbeelden voor Node, Python en browser.
Welke JSON Schema-drafts ondersteunt deze validator?
Draft 2020-12 (standaard en aanbevolen), Draft 2019-09 en Draft-07. De validator detecteert de draft automatisch via de $schema-URI van het schema; ontbreekt die, dan wordt teruggevallen op je keuze in het dropdown. Gebruik voor nieuwe projecten in 2026 Draft 2020-12 — OpenAPI 3.1 gebruikt die ingebouwd en het is de standaard van Ajv. Draft-07 leeft voort in legacy-codebases (oudere AJV-configuraties, Helm-charts, VS Code-settings).
Hoe valideer ik JSON tegen een schema?
Plak je JSON-data in het linkerpaneel en je JSON Schema in het rechterpaneel. De validator draait direct terwijl je typt — een groen vinkje betekent geldig, een rode lijst betekent fouten. Elke fout bevat een JSON Pointer-pad (bijvoorbeeld /user/email), het falende keyword (type, required, pattern, minimum) en een leesbare boodschap. Klik op een fout om naar de bewuste regel te springen. Geen upload, geen account nodig.
Wat is het verschil tussen JSON Schema-validatie en JSON-syntaxcontrole?
JSON-syntaxcontrole bevestigt alleen dat het document parseerbaar is — geen extra komma's, geen ontbrekende accolades. Daar is de JSON Formatter voor. JSON Schema-validatie draait ná het parsen en controleert of de geparseerde structuur het contract volgt: required-velden aanwezig, types kloppen, waarden binnen het bereik. Meestal doe je beide — eerst formatteren om parseerbaarheid te bevestigen, dan tegen het schema valideren.
Waarom wijst mijn schema JSON af die er goed uitziet?
Vijf gebruikelijke verdachten: (1) additionalProperties: false — je data bevat een key die het schema niet verklaart, vaak een typefout of een nieuw veld; (2) type: "integer" vs "number" — JSON Schema beschouwt 1.0 als number, niet als integer; (3) format-keywords (email, uri, uuid) wijzen misvormde strings af, ook als ze er goed uitzien; (4) required op het verkeerde nestelniveau — required moet náást properties staan, niet erbinnen; (5) de JSON heeft een string "42" waar het schema integer 42 verwacht. Het foutpad wijst aan welke het is.
Worden $ref en remote schemareferenties ondersteund?
Interne $ref-pointers (#/$defs/foo, #/properties/bar) werken direct. Remote $ref naar externe URL's is bewust uitgeschakeld — externe schema's ophalen zou je validatie-activiteit lekken naar derden en het privacymodel breken. Om tegen een meervoudig-schema te valideren, embed je de gerefereerde definities in één document via $defs, of voer je validatie uit in je eigen CI met Ajv waar remote refs op hun plek zijn.
Wat doet additionalProperties: false?
additionalProperties: false weigert elke key die niet in properties is verklaard. Dit is het nuttigste keyword om contracten aan te scherpen — zonder zijn schema's standaard open en accepteren ze stilzwijgend verkeerd geschreven of kwaadaardige velden. Zet altijd additionalProperties: false op invoercontracten (request bodies, configuratiebestanden, queueberichten). Laat het alleen op true (of weg) als het schema een gedeeltelijke beschrijving is van een groter document.
Hoe valideer ik JSON tegen een schema in Node.js of Python?
Node: installeer Ajv (npm i ajv ajv-formats), roep new Ajv().compile(schema) aan en daarna validate(data). Python: installeer jsonschema (pip install jsonschema), roep jsonschema.validate(data, schema) aan. Voor TypeScript genereer je types uit het schema met json-schema-to-typescript zodat compile-time en runtime gelijk lopen. Onze gids voor JSON Schema-validatie bevat copy-paste-recepten voor Node, Python en browser.
Wat is het verschil tussen oneOf, anyOf en allOf?
allOf — moet aan elk subschema voldoen (doorsnede, voor compositie). anyOf — moet aan minstens één voldoen (unie, fast-fail). oneOf — moet aan precies één voldoen (discriminated union, langzamer maar strikter). Gebruik oneOf voor discriminated unions zoals webhook-events met type-tag; anyOf voor permissieve unies; allOf om een basisschema uit te breiden met extra restricties. oneOf is het langzaamst omdat elke tak getest wordt — kies anyOf als 'precies één' niet vereist is.
Worden OpenAPI-schema's ondersteund?
OpenAPI 3.1 gebruikt Draft 2020-12 ingebouwd, dus elke OpenAPI 3.1-schemacomponent kun je rechtstreeks plakken. OpenAPI 3.0 gebruikt een Draft 4-subset die grotendeels compatibel is — je kunt randgevallen tegenkomen rond nullable: true (3.0-syntax), wat Draft 2020-12 uitdrukt als type: ["string", "null"]. Voor volledige OpenAPI-documentvalidatie (paths, operations, security) gebruik je een toegewijde OpenAPI-linter zoals Spectral; deze tool richt zich op het schemagedeelte.
Waarom zegt de validator dat mijn JSON Schema zelf ongeldig is?
JSON Schema is een JSON-document dat geldig JSON moet zijn voordat het een geldig schema kan zijn. Veelvoorkomende oorzaken: trailing comma in een properties-object, enkele in plaats van dubbele aanhalingstekens, $schema gericht op een niet-bestaande draft-URL, of required als string in plaats van als array opgegeven. Formatteer het schema eerst in JSON Formatter om syntaxfouten boven water te krijgen, en plak het daarna hier terug voor semantische validatie.
Stuurt de tool mijn JSON of schema naar een server?
Nee. Al het parsen en valideren draait lokaal in je browser. Je JSON, je schema en het validatieresultaat verlaten je machine nooit — geen upload, geen localStorage van invoer, geen analytics op wat je plakt. Veilig voor proprietaire API-contracten, interne configuratiebestanden en gevoelige payloads. Alleen je draftkeuze blijft in localStorage staan zodat die een refresh overleeft; wis browsergegevens om die te verwijderen.
Kan ik JSON Lines (NDJSON) of meerdere documenten valideren?
Deze tool valideert één document per run. Voor JSON Lines valideer je elke regel apart of gebruik je Ajv in Node met een schema en een streamparser zoals JSONStream. Voor batchvalidatie van grote datasets is de commandoregel beter — ajv-cli of check-jsonschema (Python) verwerken duizenden bestanden per seconde met één schemacompilatie.

Gerelateerde tools

Alle tools bekijken →