title: JSON Schema
description: Tutorial about JSON Schema - what it is, how to define, test, and use it
tags:
- schema
- validation
- api
- data-format
- javascript
- json
pageType: concept
created: 2026-04-13JSON Schema ist eine deklarative Sprache, die Sie verwenden können, um JSON-Dokumente zu annotieren und zu validieren. Sie können sich JSON Schema wie einen Vertrag für Ihre JSON-Daten vorstellen - er definiert, wie die Daten aussehen sollten, welche Typen sie haben sollen, gültige Werte und Beziehungen zwischen Feldern.
Ein JSON Schema ist selbst ein JSON-Dokument. Die grundlegende Struktur folgt diesem Muster:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "User Profile",
"description": "Ein Benutzerprofil mit optionalen Details",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"age": {
"type": "integer",
"minimum": 0,
"maximum": 150
},
"email": {
"type": "string",
"format": "email"
},
"is_active": {
"type": "boolean",
"default": true
},
"roles": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1
}
},
"required": ["name", "email"],
"additionalProperties": false
}| Komponente | Beschreibung | Beispiel |
|---|---|---|
$schema |
Version des Schema-Specs, die verwendet werden soll | "https://json-schema.org/draft/2020-12/schema" |
title |
Menschlich lesbarer Titel | "Benutzerprofil" |
description |
Menschlich beschreibende Beschreibung | "Ein Benutzer mit grundlegenden Infos" |
type |
Primitive Datentypen | "string", "object",
"array" |
properties |
Definitionen von Feldern | "name": { "type": "string" } |
required |
Felder, die vorhanden sein müssen | ["name", "email"] |
additionalProperties |
Ob zusätzliche Felder erlaubt sind | false (streng) |
{
"type": "string",
"enum": ["admin", "user", "guest"], // Muss einer dieser Werte sein
"pattern": "^\\d+$", // Regex-Muster
"format": "email", // E-Mail, uri, date-time, uuid, etc.
"minLength": 1,
"maxLength": 50,
"default": "guest"
}const Ajv = require("ajv");
const ajv = new Ajv(); // options: { allErrors: true }
const schema = {
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "integer" }
},
"required": ["name"]
};
const validate = ajv.compile(schema);
const data = { name: "Alice", age: 30 };
const valid = validate(data);
if (valid) {
console.log("Daten sind gültig!");
} else {
console.log("Validierungsfehler:", validate.errors);
}from jsonschema import validate, ValidationError
schema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"}
},
"required": ["name"]
}
data = {"name": "Alice", "age": 30}
try:
validate(instance=data, schema=schema)
print("Daten sind gültig!")
except ValidationError as e:
print(f"Validierungsfehler: {e.message}")package main
import (
"encoding/json"
"fmt"
"github.com/xeipuuv/gojsonschema"
)
func main() {
schemaLoader := gojsonschema.NewReferenceLoader("file:///path/to/schema.json")
documentLoader := gojsonschema.NewStringLoader(`{"name": "Alice", "age": 30}`)
result, err := gojsonschema.Validate(schemaLoader, documentLoader)
if err != nil {
panic(err)
}
if result.Valid() {
fmt.Println("Das Dokument ist gültig")
} else {
fmt.Println("Das Dokument ist nicht gültig. siehe fehler:")
for _, desc := range result.Errors() {
fmt.Println("-", desc)
}
}
}# Using ajv-cli (Node.js)
npm install -g ajv-cli
ajv validate -s schema.json -d data.json
# Using Python's jsonschema CLI
pip install jsonschema
jsonschema --instance data.json --schema schema.json# Testdaten generieren
npm install -g json-schema-faker
json-schema-faker -s schema.json -r > test-data.jsonconst ajv = require("ajv");
const ajv = new Ajv({ allErrors: true });
const validate = ajv.compile(schema);
describe("Benutzervalidierung", () => {
test("gültiger Benutzer sollte bestehen", () => {
const validData = { name: "Alice", email: "alice@example.com" };
expect(validate(validData)).toBe(true);
});
test("Benutzer ohne E-Mail sollte fehlschlagen", () => {
const invalidData = { name: "Bob" };
expect(validate(invalidData)).toBe(false);
expect(validate.errors).toHaveLength(1);
});
});$schema-Schlüsselwort um
die Version zu spezifizieren (aktuell: 2020-12 oder
draft-07)$ref für gängige Mustertitle und
description für API-NutzeradditionalProperties: false
auf Objekten, die Sie streng validieren wollenoneOf, anyOf,
allOf für komplexe Validierungsregelnuser-v1.json, user-v2.json){
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/schemas/product.json",
"title": "Product",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^PROD-\\d+$"
},
"name": {
"type": "string",
"minLength": 3
},
"price": {
"type": "number",
"minimum": 0,
"multipleOf": 0.01
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"uniqueItems": true
},
"metadata": {
"type": "object",
"properties": {
"created_at": { "format": "date-time" },
"updated_at": { "format": "date-time" }
}
}
},
"required": ["id", "name", "price"],
"additionalProperties": false
}