Wat is JSON Schema-validatie?
JSON Schema-validatie is het proces van controleren of een JSON-document voldoet aan een set structurele beperkingen en waardebeperkingen die zijn gedefinieerd in een JSON Schema. Het schema zelf is een JSON-document dat de verwachte vorm van uw data beschrijft: welke eigenschappen verplicht zijn, welke typen ze moeten hebben, de toegestane bereiken voor getallen, stringpatronen, arraylenghten en meer. De JSON Schema-specificatie wordt onderhouden op json-schema.org en gepubliceerd als een reeks IETF-drafts; Draft 7 en Draft 2020-12 zijn het meest breed geadopteerd.
Waar gewone JSON-validatie alleen syntaxis controleert (zijn de haakjes goed gesloten? zijn strings tussen aanhalingstekens?), gaat schemavalidatie verder. Het beantwoordt vragen als: bevat de respons van deze API een "id"-veld dat altijd een integer is? Is het "status"-veld een van drie toegestane waarden? Zijn geneste objecten correct opgebouwd? Dit soort structurele verificatie vangt bugs die syntaxiscontroles volledig missen, omdat syntactisch geldige JSON nog steeds semantisch onjuist kan zijn voor uw applicatie.
JSON Schema wordt gebruikt in OpenAPI/Swagger-definities, validatie van configuratiebestanden, formuliervalidatie, documentbeperkingen in databases en geautomatiseerd testen. Tools zoals Ajv (JavaScript), jsonschema (Python) en check-jsonschema (CLI) implementeren de specificatie zodat u data programmatisch kunt valideren. Met deze online validator kunt u zowel een schema als een datadocument plakken om direct de conformiteit te controleren, zonder een bibliotheek te installeren.
Waarom een online JSON Schema Validator gebruiken?
Schemas schrijven en validatiefouten handmatig debuggen kost veel tijd. Een online JSON Schema Validator geeft directe feedback of uw data overeenkomt met uw schema, met duidelijke foutmeldingen die precies de eigenschap aanwijzen die niet voldoet.
Gebruiksscenario's voor JSON Schema-validatie
Referentie voor JSON Schema-sleutelwoorden
Een JSON Schema is opgebouwd uit sleutelwoorden die elk een beperking opleggen aan de gevalideerde data. De onderstaande tabel toont de meest gebruikte sleutelwoorden in Draft 7 en later. Elk sleutelwoord kan worden gecombineerd met andere sleutelwoorden in hetzelfde schema-object.
| Sleutelwoord | Doel | Voorbeeld |
|---|---|---|
| type | Restricts the data type | "type": "string" |
| properties | Defines expected object keys and their schemas | "properties": { "name": { "type": "string" } } |
| required | Lists mandatory properties | "required": ["id", "name"] |
| items | Schema for array elements | "items": { "type": "number" } |
| enum | Restricts value to a fixed set | "enum": ["active", "inactive"] |
| pattern | Regex constraint on strings | "pattern": "^[A-Z]{2}\\d{4}$" |
| minimum / maximum | Numeric range bounds | "minimum": 0, "maximum": 100 |
| minLength / maxLength | String length bounds | "minLength": 1, "maxLength": 255 |
| $ref | Reuses another schema by URI | "$ref": "#/$defs/address" |
| additionalProperties | Controls extra keys in objects | "additionalProperties": false |
| anyOf / oneOf / allOf | Combines multiple schemas logically | "anyOf": [{ "type": "string" }, { "type": "null" }] |
| if / then / else | Conditional schema application | "if": { "properties": { "type": { "const": "email" } } } |
Vergelijking van JSON Schema-drafts: Draft 7 vs 2019-09 vs 2020-12
JSON Schema heeft meerdere draftversies doorlopen. Draft 7 (gepubliceerd in 2018) heeft de breedste toolingondersteuning. Draft 2019-09 introduceerde $defs (ter vervanging van definitions), unevaluatedProperties en $recursiveRef. Draft 2020-12 (de meest recente stabiele release) verving $recursiveRef door $dynamicRef en introduceerde prefixItems voor tuplevalidatie. Controleer bij het kiezen van een draft of uw validatiebibliotheek deze ondersteunt. Ajv ondersteunt alle drie de drafts. De Python-bibliotheek jsonschema ondersteunt tot en met 2020-12 sinds versie 4.0.
| Functie | Draft 7 | Draft 2019-09 | Draft 2020-12 |
|---|---|---|---|
| $schema URI | draft-07/schema# | 2019-09/schema | 2020-12/schema |
| if / then / else | Yes | Yes | Yes |
| $defs (definitions) | definitions | $defs | $defs |
| $ref alongside keys | No (sibling ignored) | Yes | Yes |
| $dynamicRef | No | No ($recursiveRef) | Yes |
| prefixItems | No (use items array) | No (use items array) | Yes |
| unevaluatedProperties | No | Yes | Yes |
| $vocabulary | No | Yes | Yes |
Codevoorbeelden
Deze voorbeelden laten zien hoe u JSON programmatisch kunt valideren tegen een schema. Elk voorbeeld gebruikt een goed onderhouden bibliotheek voor het betreffende taalecosysteem.
import Ajv from 'ajv';
const ajv = new Ajv();
const schema = {
type: 'object',
properties: {
name: { type: 'string', minLength: 1 },
age: { type: 'integer', minimum: 0 },
email: { type: 'string', format: 'email' }
},
required: ['name', 'email'],
additionalProperties: false
};
const data = { name: 'Alice', age: 30, email: 'alice@example.com' };
const validate = ajv.compile(schema);
const valid = validate(data);
console.log(valid); // → true
console.log(validate.errors); // → null
// Invalid data — missing required "email"
validate({ name: 'Bob', age: 25 });
console.log(validate.errors);
// → [{ instancePath: '', keyword: 'required', params: { missingProperty: 'email' } }]from jsonschema import validate, ValidationError
schema = {
"type": "object",
"properties": {
"name": {"type": "string", "minLength": 1},
"age": {"type": "integer", "minimum": 0},
"tags": {
"type": "array",
"items": {"type": "string"},
"uniqueItems": True
}
},
"required": ["name"]
}
# Valid data
validate(instance={"name": "Alice", "age": 30, "tags": ["admin"]}, schema=schema)
# → No exception raised
# Invalid data — wrong type for "age"
try:
validate(instance={"name": "Alice", "age": "thirty"}, schema=schema)
except ValidationError as e:
print(e.message)
# → 'thirty' is not of type 'integer'
print(e.json_path)
# → $.agepackage main
import (
"fmt"
"strings"
"github.com/santhosh-tekuri/jsonschema/v5"
)
func main() {
schemaJSON := `{
"type": "object",
"properties": {
"id": { "type": "integer" },
"status": { "enum": ["active", "inactive"] }
},
"required": ["id", "status"]
}`
compiler := jsonschema.NewCompiler()
compiler.AddResource("schema.json", strings.NewReader(schemaJSON))
schema, _ := compiler.Compile("schema.json")
// Valid data
data := map[string]interface{}{"id": 1, "status": "active"}
err := schema.Validate(data)
fmt.Println(err) // → <nil>
// Invalid — missing "status"
bad := map[string]interface{}{"id": 2}
err = schema.Validate(bad)
fmt.Println(err) // → validation failed: missing properties: 'status'
}# Install via pip pip install check-jsonschema # Validate a file against a schema check-jsonschema --schemafile schema.json data.json # → ok -- validation done # Validate against a remote schema (e.g., GitHub Actions workflow) check-jsonschema --builtin-schema vendor.github-workflows my-workflow.yml # Validate multiple files at once check-jsonschema --schemafile schema.json file1.json file2.json file3.json