ToolHub
View All Posts

JSON Schema Validatiehandleiding: Valideer Je Datastructuur

Elke applicatie die data ontvangt van externe bronnen staat voor dezelfde fundamentele vraag: kan ik deze data vertrouwen? Of het nu een API request body is, een configuratiebestand, een bericht uit een queue, of een data-import, onvertrouwde data moet worden gevalideerd voordat het jouw systeem betreedt. JSON Schema biedt een gestandaardiseerde, taalonafhankelijke manier om te definiëren hoe geldige data eruitziet en om te verifiëren dat inkomende data aan die definitie voldoet. Deze handleiding behandelt alles, van het schrijven van je eerste schema tot geavanceerde patronen voor complexe validatie, met praktische voorbeelden die je direct kunt toepassen.

Wat is JSON Schema?

JSON Schema is een JSON-document dat de structuur en beperkingen van andere JSON-documenten beschrijft. Het is een vocabulaire waarmee je JSON-data kunt annoteren en valideren, gestandaardiseerd via de Internet Engineering Task Force (IETF). Een JSON Schema definieert regels over welke velden moeten bestaan, van welk type ze moeten zijn, welke waarden acceptabel zijn, en hoe objecten en arrays moeten worden gestructureerd.

Zie JSON Schema als een contract voor je data. Zoals een databaseschema de kolommen, typen en beperkingen van een tabel definieert, definieert een JSON Schema de eigenschappen, typen en beperkingen van een JSON-document. Elke JSON-data die aan alle beperkingen in een schema voldoet wordt een geldige instantie genoemd, terwijl data die een beperking schendt ongeldig is.

Wat JSON Schema Niet Is

JSON Schema Versies

JSON Schema heeft zich ontwikkeld via verschillende drafts, die elk functies toevoegen en de vocabulaire verfijnen. Als je de versies begrijpt, kun je de juiste kiezen voor jouw project en compatibiliteitsproblemen vermijden.

Versie$schema URIStatusBelangrijkste Functies
Draft 2020-12https://json-schema.org/draft/2020-12/schemaHuidigprefixItems, dynamicRef, vocabulary support
Draft 2019-09https://json-schema.org/draft/2019-09/schemaStabielunevaluatedProperties, $recursiveRef
Draft 7http://json-schema.org/draft-07/schema#Breed ondersteundif/then/else, contentEncoding
Draft 6http://json-schema.org/draft-06/schema#LegacypropertyNames, contains
Draft 4http://json-schema.org/draft-04/schema#VerouderdOorspronkelijk breed toegepaste versie
Aanbeveling: Gebruik Draft 2020-12 voor nieuwe projecten. Het is de meest recente stabiele versie met de meeste functies en wordt ondersteund door grote validatiebibliotheken. Als je maximale compatibiliteit met bestaande tools nodig hebt, is Draft 7 een veilige keuze. Vermijd Draft 4 en ouder.

Je Eerste Schema Schrijven

Laten we beginnen met een eenvoudig voorbeeld: een schema voor een gebruikersobject met een naam, e-mail en leeftijd.

{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://example.com/schemas/user.json",
    "title": "User",
    "description": "A user account in the system",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "The user's full name"
        },
        "email": {
            "type": "string",
            "format": "email",
            "description": "The user's email address"
        },
        "age": {
            "type": "integer",
            "minimum": 0,
            "maximum": 150,
            "description": "The user's age in years"
        }
    },
    "required": ["name", "email"],
    "additionalProperties": false
}

Dit schema declareert dat een geldige gebruiker een object moet zijn met name en email als verplichte tekenreekseigenschappen. De eigenschap age is optioneel, maar moet een geheel getal tussen 0 en 150 zijn indien aanwezig. De additionalProperties: false beperking voorkomt eigenschappen die niet in het schema zijn gedefinieerd, wat typefouten en onverwachte velden opvangt.

Kernwoorden Referentie

JSON Schema biedt een rijke vocabulaire van sleutelwoorden voor het definiëren van beperkingen. Hier zijn de belangrijkste, georganiseerd per categorie.

Type Sleutelwoorden

SleutelwoordBeschrijvingVoorbeeld
typeVerwachte datatype(n)"type": "string" of "type": ["string", "null"]
enumLijst van toegestane waarden"enum": ["active", "inactive", "pending"]
constMoet exact aan deze waarde voldoen"const": "v2"

Getalbeperkingen

SleutelwoordBeschrijvingVoorbeeld
minimumMinimumwaarde (inclusief)"minimum": 0
exclusiveMinimumMinimumwaarde (exclusief)"exclusiveMinimum": 0
maximumMaximumwaarde (inclusief)"maximum": 100
exclusiveMaximumMaximumwaarde (exclusief)"exclusiveMaximum": 100
multipleOfMoet een veelvoud van deze waarde zijn"multipleOf": 0.01

Tekenreeksbeperkingen

SleutelwoordBeschrijvingVoorbeeld
minLengthMinimum tekenreekslengte"minLength": 1
maxLengthMaximum tekenreekslengte"maxLength": 255
patternRegex-patroon waaraan de tekenreeks moet voldoen"pattern": "^[A-Z]{2}\\d{4}$"
formatSemantisch formaat (email, uri, date-time, enz.)"format": "email"

Objectbeperkingen

SleutelwoordBeschrijvingVoorbeeld
propertiesSchema voor elke bekende eigenschap"properties": {"name": {"type": "string"}}
requiredLijst van verplichte eigenschappen"required": ["name", "email"]
additionalPropertiesOf extra eigenschappen zijn toegestaan"additionalProperties": false
minPropertiesMinimum aantal eigenschappen"minProperties": 1
maxPropertiesMaximum aantal eigenschappen"maxProperties": 10
patternPropertiesSchema's voor eigenschappen die aan een regex voldoen"patternProperties": {"^S_": {"type": "string"}}

Arraybeperkingen

SleutelwoordBeschrijvingVoorbeeld
itemsSchema voor alle array-items"items": {"type": "string"}
prefixItemsSchema's voor positionele items (Draft 2020-12)"prefixItems": [{"type": "string"}, {"type": "number"}]
minItemsMinimum aantal items"minItems": 1
maxItemsMaximum aantal items"maxItems": 100
uniqueItemsAlle items moeten uniek zijn"uniqueItems": true

Veelvoorkomende Schema Patronen

Schema's in de praktijk vereisen vaak patronen die verder gaan dan eenvoudige typecontrole. Hier zijn de meest voorkomende patronen.

Voorwaardelijke Validatie met if/then/else

Gebruik voorwaardelijke logica om verschillende beperkingen toe te passen op basis van de waarde van een eigenschap. Een betaalobject vereist bijvoorbeeld verschillende velden, afhankelijk van de betaalmethode.

{
    "type": "object",
    "properties": {
        "method": { "enum": ["credit_card", "bank_transfer"] },
        "card_number": { "type": "string" },
        "routing_number": { "type": "string" }
    },
    "required": ["method"],
    "if": {
        "properties": { "method": { "const": "credit_card" } }
    },
    "then": {
        "required": ["card_number"]
    },
    "else": {
        "required": ["routing_number"]
    }
}

Compositie met allOf, anyOf, oneOf

Compositie-sleutelwoorden stellen je in staat schema's op krachtige manieren te combineren:

{
    "oneOf": [
        {
            "type": "object",
            "properties": {
                "type": { "const": "email" },
                "address": { "type": "string", "format": "email" }
            },
            "required": ["type", "address"]
        },
        {
            "type": "object",
            "properties": {
                "type": { "const": "phone" },
                "number": { "type": "string", "pattern": "^\\+?[1-9]\\d{1,14}$" }
            },
            "required": ["type", "number"]
        }
    ]
}

Schema's Hergebruiken met $ref

Het $ref sleutelwoord stelt je in staat schema's te refereren en hergebruiken, wat duplicatie elimineert en je schema's onderhoudbaar houdt. Je kunt schema's binnen hetzelfde document of in externe bestanden refereren.

{
    "$id": "https://example.com/schemas/order.json",
    "type": "object",
    "properties": {
        "customer": { "$ref": "#/$defs/address" },
        "shipping": { "$ref": "#/$defs/address" },
        "billing": { "$ref": "#/$defs/address" },
        "items": {
            "type": "array",
            "items": { "$ref": "#/$defs/lineItem" },
            "minItems": 1
        }
    },
    "required": ["customer", "items"],
    "$defs": {
        "address": {
            "type": "object",
            "properties": {
                "street": { "type": "string" },
                "city": { "type": "string" },
                "zip": { "type": "string", "pattern": "^\\d{5}(-\\d{4})?$" },
                "country": { "type": "string", "minLength": 2, "maxLength": 2 }
            },
            "required": ["street", "city", "zip", "country"]
        },
        "lineItem": {
            "type": "object",
            "properties": {
                "product": { "type": "string" },
                "quantity": { "type": "integer", "minimum": 1 },
                "price": { "type": "number", "exclusiveMinimum": 0 }
            },
            "required": ["product", "quantity", "price"]
        }
    }
}

Nullable Types

In JSON Schema Draft 2020-12 worden nullable types uitgedrukt met een array van typen die "null" omvat:

{
    "type": ["string", "null"],
    "description": "An optional display name, or null if not set"
}

In oudere drafts werd het nullable: true sleutelwoord gebruikt in OpenAPI-specificaties. Voor standaard JSON Schema gebruik je altijd de type array-benadering.

Formaatvalidatie

Het format sleutelwoord biedt semantische validatie naast structurele controles. Het specificeert dat een tekenreeks aan een bekend formaat moet voldoen. Veelvoorkomende ondersteunde formaten zijn:

FormaatBeschrijvingVoorbeeld
emailE-mailadresuser@example.com
uriGeldige URIhttps://example.com/path
uri-referenceURI of relatieve referentie/path/to/resource
date-timeISO 8601 date-time2026-05-19T14:30:00Z
dateISO 8601 date2026-05-19
timeISO 8601 time14:30:00Z
ipv4IPv4-adres192.168.1.1
ipv6IPv6-adres::1
uuidUniversally unique identifier550e8400-e29b-41d4-a716-446655440000
hostnameInternet hostnamewww.example.com
Belangrijk: Standaard is het format sleutelwoord een annotatie, geen beperking. Validators kunnen het negeren tenzij je formaatvalidatie expliciet inschakelt. Geef in Ajv { strict: true } of { validateFormats: true } door om formaatcontrole af te dwingen. Verifieer altijd dat je validator formaatbeperkingen afdwingt.

JSON Data Programmatisch Valideren

Schemavalidatie is het nuttigst wanneer het in je applicatiecode is geïntegreerd. Hier zijn voorbeelden met populaire libraries in verschillende talen.

JavaScript met Ajv

Ajv is de meest gebruikte JSON Schema validator voor JavaScript. Het ondersteunt alle draft-versies en biedt uitstekende prestaties door JIT-compilatie van schema's.

import Ajv from 'ajv';
import addFormats from 'ajv-formats';

const ajv = new Ajv();
addFormats(ajv);

const schema = {
    type: 'object',
    properties: {
        name: { type: 'string', minLength: 1 },
        email: { type: 'string', format: 'email' },
        age: { type: 'integer', minimum: 0 }
    },
    required: ['name', 'email'],
    additionalProperties: false
};

const validate = ajv.compile(schema);
const valid = validate({ name: 'Alice', email: 'alice@example.com', age: 30 });

if (!valid) {
    console.log(validate.errors);
    // [{ keyword: 'required', params: { missingProperty: 'email' }, ... }]
}

Python met jsonschema

from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string", "minLength": 1},
        "email": {"type": "string", "format": "email"},
        "age": {"type": "integer", "minimum": 0}
    },
    "required": ["name", "email"],
    "additionalProperties": False
}

try:
    validate(instance={"name": "Alice", "email": "alice@example.com"}, schema=schema)
except ValidationError as e:
    print(f"Validation failed: {e.message}")

API Datavalidatie met JSON Schema

Een van de waardevolste toepassingen van JSON Schema is het valideren van API request- en response-data. Dit zorgt ervoor dat je API goed gevormde input ontvangt en data in het verwachte formaat teruggeeft, fouten vroegtijdig opvangt en duidelijke foutmeldingen aan clients levert.

Express.js Middleware

import Ajv from 'ajv';

const ajv = new Ajv({ allErrors: true });

function validateBody(schema) {
    const validate = ajv.compile(schema);
    return (req, res, next) => {
        if (!validate(req.body)) {
            return res.status(400).json({
                error: 'Validation failed',
                details: validate.errors
            });
        }
        next();
    };
}

app.post('/api/users',
    validateBody({
        type: 'object',
        properties: {
            name: { type: 'string', minLength: 1, maxLength: 100 },
            email: { type: 'string', format: 'email' },
            role: { enum: ['admin', 'editor', 'viewer'] }
        },
        required: ['name', 'email'],
        additionalProperties: false
    }),
    (req, res) => {
        // req.body is guaranteed valid here
        createUser(req.body);
    }
);

OpenAPI en JSON Schema

OpenAPI (voorheen Swagger) gebruikt een subset van JSON Schema voor het definiëren van API request- en response-schema's. Als je al OpenAPI gebruikt, kun je de schema's uit je API-specificatie halen en gebruiken voor runtime-validatie. Tools zoals openapi-schema-validator en express-openapi-validator automatiseren dit proces, zodat je API-documentatie en validatielogica altijd gesynchroniseerd blijven.

Best Practices

JSON-data tegen een schema willen valideren? Probeer onze gratis online JSON Schema Validator. Plak je schema en data om direct validatieresultaten te krijgen met gedetailleerde foutmeldingen.

JSON Schema ValidatorJSON Formatter

Veelgestelde Vragen

Wat is JSON Schema?

JSON Schema is een JSON-document dat de structuur en beperkingen van andere JSON-documenten beschrijft. Het laat je verplichte velden, verwachte datatypen, waardebereiken, tekenreekspatronen en geneste objectstructuren definiëren. Je kunt het gebruiken om inkomende data te valideren, documentatie te genereren en form interfaces automatisch te maken.

Welke versie van JSON Schema moet ik gebruiken?

Gebruik JSON Schema Draft 2020-12 voor nieuwe projecten. Het is de meest recente stabiele versie en wordt ondersteund door grote validatiebibliotheken zoals Ajv. Draft 7 wordt ook breed ondersteund als je compatibiliteit met oudere tools nodig hebt. Vermijd Draft 4 en ouder, omdat deze verouderde sleutelwoorden gebruiken en moderne functies missen.

Hoe verschilt JSON Schema van TypeScript interfaces?

TypeScript interfaces bieden compile-time typecontrole, maar alleen binnen TypeScript-code. JSON Schema biedt runtime-validatie die werkt tussen programmeertalen en data van elke bron kan valideren (API-requests, bestanden, databases). Gebruik TypeScript voor veiligheid tijdens de ontwikkeling en JSON Schema voor runtime datavalidatie op systeemgrenzen.

Kan JSON Schema API request bodies valideren?

Ja, JSON Schema wordt veel gebruikt voor API request- en response-validatie. Frameworks zoals Express (met express-json-validator), FastAPI en Spring Boot ondersteunen JSON Schema-validatie direct of via middleware. Het valideren van request bodies tegen een schema zorgt ervoor dat inkomende data de juiste structuur heeft voordat je applicatie deze verwerkt.

Wat zijn de belangrijkste JSON Schema sleutelwoorden?

De meest essentiële sleutelwoorden zijn: type (datatype), properties (objectvelden), required (verplichte velden), items (array element schema), minimum/maximum (getalgrenzen), minLength/maxLength (tekenreeksgrenzen), pattern (regex voor tekenreeksen), enum (toegestane waarden) en $ref (referentie om schema's te hergebruiken). Deze dekken het overgrote deel van de validatiebehoeften.