ToolHub
View All Posts

JSON Schema-Validierungsleitfaden: Überprüfen Sie Ihre Datenstruktur

Jede Anwendung, die Daten von externen Quellen empfängt, steht vor demselben grundlegenden Problem: Kann ich diesen Daten vertrauen? Ob API-Anforderungstexte, Konfigurationsdateien, Warteschlangennachrichten oder Datenimporte – nicht vertrauenswürdige Daten müssen validiert werden, bevor sie in das System gelangen. JSON Schema bietet eine standardisierte, sprachunabhängige Möglichkeit, zu definieren, wie gültige Daten aussehen, und eingehende Daten gegen diese Definition zu validieren. Dieser Leitfaden behandelt alles vom Schreiben Ihres ersten Schemas bis zu fortgeschrittenen Mustern für komplexe Validierung, mit praktischen Beispielen, die Sie sofort anwenden können.

Was ist JSON Schema?

JSON Schema ist ein JSON-Dokument, das die Struktur und Einschränkungen anderer JSON-Dokumente beschreibt. Es ist ein Vokabular, mit dem Sie JSON-Daten annotieren und validieren können, standardisiert von der Internet Engineering Task Force (IETF). JSON Schema definiert Regeln darüber, welche Felder vorhanden sein müssen, welchen Typ sie haben müssen, welche Werte akzeptabel sind und wie Objekte und Arrays strukturiert sein sollten.

Stellen Sie sich JSON Schema als Ihren Datenvertrag vor. So wie ein Datenbankschema die Spalten, Typen und Einschränkungen einer Tabelle definiert, definiert JSON Schema die Eigenschaften, Typen und Einschränkungen eines JSON-Dokuments. Alle JSON-Daten, die alle Einschränkungen in einem Schema erfüllen, werden als gültige Instanz bezeichnet, während Daten, die eine Einschränkung verletzen, ungültig sind.

Was JSON Schema nicht ist

JSON Schema-Versionen

JSON Schema hat sich durch mehrere Entwürfe weiterentwickelt, wobei jeder Entwurf Funktionen hinzufügte und das Vokabular verfeinerte. Das Verständnis dieser Versionen hilft Ihnen, die richtige für Ihr Projekt auszuwählen und Kompatibilitätsprobleme zu vermeiden.

Version$schema-URIStatusHauptfunktionen
Draft 2020-12https://json-schema.org/draft/2020-12/schemaAktuelle VersionprefixItems, dynamicRef, Vokabularunterstützung
Draft 2019-09https://json-schema.org/draft/2019-09/schemaStabilunevaluatedProperties, $recursiveRef
Draft 7http://json-schema.org/draft-07/schema#Weit verbreitetif/then/else, contentEncoding
Draft 6http://json-schema.org/draft-06/schema#VeraltetpropertyNames, contains
Draft 4http://json-schema.org/draft-04/schema#VeraltetErste weit verbreitete Version
Empfehlung: Verwenden Sie Draft 2020-12 für neue Projekte. Es ist die neueste stabile Version mit den meisten Funktionen und wird von wichtigen Validierungsbibliotheken unterstützt. Wenn Sie maximale Kompatibilität mit bestehenden Tools benötigen, ist Draft 7 eine sichere Wahl. Vermeiden Sie Draft 4 und früher.

Ihr erstes Schema schreiben

Beginnen wir mit einem einfachen Beispiel: einem Schema für ein Benutzerobjekt mit Name, E-Mail und Alter.

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

Dieses Schema deklariert, dass ein gültiger Benutzer ein Objekt sein muss, bei dem name und email erforderliche String-Eigenschaften sind. Die Eigenschaft age ist optional, muss aber, wenn vorhanden, eine Ganzzahl zwischen 0 und 150 sein. additionalProperties: false verhindert alle Eigenschaften, die nicht im Schema definiert sind, und erkennt so Tippfehler und unerwartete Felder.

Referenz der Kernschlüsselwörter

JSON Schema bietet ein umfangreiches Vokabular an Schlüsselwörtern zur Definition von Einschränkungen. Hier sind die wichtigsten Schlüsselwörter, nach Kategorien geordnet.

Typ-Schlüsselwörter

SchlüsselwortBeschreibungBeispiel
typeErwarteter Datentyp"type": "string" oder "type": ["string", "null"]
enumListe erlaubter Werte"enum": ["active", "inactive", "pending"]
constMuss genau diesem Wert entsprechen"const": "v2"

Zahlenbeschränkungen

SchlüsselwortBeschreibungBeispiel
minimumMindestwert (inklusive)"minimum": 0
exclusiveMinimumMindestwert (exklusiv)"exclusiveMinimum": 0
maximumHöchstwert (inklusive)"maximum": 100
exclusiveMaximumHöchstwert (exklusiv)"exclusiveMaximum": 100
multipleOfMuss ein Vielfaches dieses Wertes sein"multipleOf": 0.01

String-Beschränkungen

SchlüsselwortBeschreibungBeispiel
minLengthMinimale String-Länge"minLength": 1
maxLengthMaximale String-Länge"maxLength": 255
patternRegex, dem der String entsprechen muss"pattern": "^[A-Z]{2}\\d{4}$"
formatSemantisches Format (email, uri, date-time usw.)"format": "email"

Objektbeschränkungen

SchlüsselwortBeschreibungBeispiel
propertiesSchema für jede bekannte Eigenschaft"properties": {"name": {"type": "string"}}
requiredListe erforderlicher Eigenschaften"required": ["name", "email"]
additionalPropertiesOb zusätzliche Eigenschaften erlaubt sind"additionalProperties": false
minPropertiesMinimale Anzahl von Eigenschaften"minProperties": 1
maxPropertiesMaximale Anzahl von Eigenschaften"maxProperties": 10
patternPropertiesSchema für Eigenschaften, die einem Regex entsprechen"patternProperties": {"^S_": {"type": "string"}}

Array-Beschränkungen

SchlüsselwortBeschreibungBeispiel
itemsSchema für alle Array-Elemente"items": {"type": "string"}
prefixItemsSchema für positionelle Elemente (Draft 2020-12)"prefixItems": [{"type": "string"}, {"type": "number"}]
minItemsMinimale Anzahl von Elementen"minItems": 1
maxItemsMaximale Anzahl von Elementen"maxItems": 100
uniqueItemsAlle Elemente müssen eindeutig sein"uniqueItems": true

Gängige Schema-Muster

Reale Schemas erfordern oft Muster, die über einfache Typprüfungen hinausgehen. Hier sind die am häufigsten verwendeten Muster.

Bedingte Validierung mit if/then/else

Verwenden Sie bedingte Logik, um basierend auf Eigenschaftswerten unterschiedliche Einschränkungen anzuwenden. Beispielsweise erfordern Zahlungsobjekte je nach Zahlungsmethode unterschiedliche Felder.

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

Komposition mit allOf, anyOf, oneOf

Kompositionsschlüsselwörter ermöglichen es Ihnen, Schemas auf leistungsstarke Weise zu kombinieren:

{
    "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-Wiederverwendung mit $ref

Das Schlüsselwort $ref ermöglicht es Ihnen, Schemas zu referenzieren und wiederzuverwenden, wodurch Duplikate vermieden werden und Schemas wartbar bleiben. Sie können auf Schemas im selben Dokument oder in externen Dateien verweisen.

{
    "$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-Typen

In JSON Schema Draft 2020-12 werden nullable-Typen mit einem Typ-Array dargestellt, das "null" enthält:

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

In früheren Entwürfen verwendete die OpenAPI-Spezifikation das Schlüsselwort nullable: true. Für Standard-JSON Schema verwenden Sie immer den Typ-Array-Ansatz.

Formatvalidierung

Das Schlüsselwort format bietet semantische Validierung über die Strukturprüfung hinaus. Es gibt an, dass ein String einem bekannten Format entsprechen muss. Zu den häufig unterstützten Formaten gehören:

FormatBeschreibungBeispiel
emailE-Mail-Adresseuser@example.com
uriGültige URIhttps://example.com/path
uri-referenceURI oder relative Referenz/path/to/resource
date-timeISO 8601 Datum/Uhrzeit2026-05-19T14:30:00Z
dateISO 8601 Datum2026-05-19
timeISO 8601 Uhrzeit14:30:00Z
ipv4IPv4-Adresse192.168.1.1
ipv6IPv6-Adresse::1
uuidUniversally Unique Identifier550e8400-e29b-41d4-a716-446655440000
hostnameInternet-Hostnamewww.example.com
Wichtiger Hinweis: Standardmäßig ist das Schlüsselwort format eine Annotation und keine Einschränkung. Validatoren können es ignorieren, es sei denn, Sie aktivieren die Formatvalidierung explizit. Übergeben Sie in Ajv { strict: true } oder { validateFormats: true }, um die Formatprüfung zu erzwingen. Überprüfen Sie immer, ob Ihr Validator Formateinschränkungen durchsetzt.

JSON-Daten programmatisch validieren

Die Schema-Validierung ist am nützlichsten, wenn sie in den Anwendungscode integriert ist. Hier sind Beispiele mit beliebten Bibliotheken in verschiedenen Sprachen.

JavaScript mit Ajv

Ajv ist der am weitesten verbreitete JSON Schema-Validator für JavaScript. Es unterstützt alle Entwurfsversionen und bietet hervorragende Leistung durch JIT-Kompilierung von Schemas.

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 mit 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-Datenvalidierung mit JSON Schema

Eine der wertvollsten Anwendungen von JSON Schema ist die Validierung von API-Anforderungs- und Antwortdaten. Dies stellt sicher, dass Ihre API wohlgeformte Eingaben erhält und Daten im erwarteten Format zurückgibt, wodurch Fehler frühzeitig erkannt und klare Fehlermeldungen an Clients bereitgestellt werden.

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 und JSON Schema

OpenAPI (ehemals Swagger) verwendet eine Teilmenge von JSON Schema, um API-Anforderungs- und Antwortschemas zu definieren. Wenn Sie bereits OpenAPI verwenden, können Sie Schemas aus Ihrer API-Spezifikation extrahieren und für die Laufzeitvalidierung verwenden. Tools wie openapi-schema-validator und express-openapi-validator können diesen Prozess automatisieren und sicherstellen, dass Ihre API-Dokumentation und Validierungslogik stets synchron bleiben.

Best Practices

Müssen Sie JSON-Daten gegen ein Schema validieren? Probieren Sie unseren kostenlosen Online-JSON Schema-Validator aus. Fügen Sie Ihr Schema und Ihre Daten ein und erhalten Sie sofortige Validierungsergebnisse mit detaillierten Fehlermeldungen.

JSON Schema-ValidatorJSON-Formatierungstool

Häufig gestellte Fragen

Was ist JSON Schema?

JSON Schema ist ein JSON-Dokument, das die Struktur und Einschränkungen anderer JSON-Dokumente beschreibt. Es ermöglicht Ihnen, erforderliche Felder, erwartete Datentypen, Wertebereiche, String-Muster und verschachtelte Objektstrukturen zu definieren. Sie können es verwenden, um eingehende Daten zu validieren, Dokumentation zu generieren und automatisch Formularoberflächen zu erstellen.

Welche JSON Schema-Version sollte ich verwenden?

Verwenden Sie JSON Schema Draft 2020-12 für neue Projekte. Dies ist die neueste stabile Version und wird von wichtigen Validierungsbibliotheken wie Ajv unterstützt. Wenn Sie Kompatibilität mit älteren Tools benötigen, ist Draft 7 ebenfalls weit verbreitet. Vermeiden Sie Draft 4 und früher, da sie veraltete Schlüsselwörter verwenden und moderne Funktionen vermissen lassen.

Was ist der Unterschied zwischen JSON Schema und TypeScript-Interfaces?

TypeScript-Interfaces bieten nur Typprüfung zur Kompilierzeit innerhalb von TypeScript-Code. JSON Schema bietet Laufzeitvalidierung über Programmiersprachen hinweg und kann Daten aus beliebigen Quellen (API-Anfragen, Dateien, Datenbanken) validieren. Verwenden Sie TypeScript für die Sicherheit während der Entwicklung und JSON Schema für die Laufzeit-Datenvalidierung an Systemgrenzen.

Kann JSON Schema API-Anforderungstexte validieren?

Ja, JSON Schema wird häufig für die Validierung von API-Anfragen und -Antworten verwendet. Frameworks wie Express (mit express-json-validator), FastAPI und Spring Boot unterstützen JSON Schema-Validierung nativ oder über Middleware. Die Validierung von Anforderungstexten gegen ein Schema stellt sicher, dass eingehende Daten die korrekte Struktur haben, bevor sie von der Anwendung verarbeitet werden.

Was sind die wichtigsten JSON Schema-Schlüsselwörter?

Die wichtigsten Schlüsselwörter sind: type (Datentyp), properties (Objektfelder), required (erforderliche Felder), items (Array-Element-Schema), minimum/maximum (numerische Grenzen), minLength/maxLength (String-Grenzen), pattern (String-regex), enum (erlaubte Werte) und $ref (Referenzen zur Schema-Wiederverwendung). Diese Schlüsselwörter decken die überwiegende Mehrheit der Validierungsanforderungen ab.