Co je validace JSON Schema?
Validace JSON Schema je proces ověřování, zda JSON dokument odpovídá sadě strukturálních a hodnotových omezení definovaných v JSON Schema. Samotné schéma je JSON dokument, který popisuje očekávaný tvar vašich dat: které vlastnosti jsou povinné, jaké typy musí mít, povolené rozsahy čísel, vzory řetězců, délky polí a další. Specifikace JSON Schema je spravována na json-schema.org a publikována jako série návrhů IETF — nejrozšířenějšími jsou Draft 7 a Draft 2020-12.
Zatímco prostá validace JSON kontroluje pouze syntaxi (jsou závorky správně spárovány? jsou řetězce v uvozovkách?), validace Schema jde dále. Odpovídá na otázky jako: obsahuje odpověď tohoto API pole "id", které je vždy celé číslo? Je pole "status" jednou ze tří povolených hodnot? Jsou vnořené objekty správně tvarované? Tento typ strukturálního ověření zachytí chyby, které syntaktická kontrola zcela přehlédne — syntakticky platný JSON může být stále sémanticky nesprávný pro vaši aplikaci.
JSON Schema se používá v definicích OpenAPI/Swagger, validaci konfiguračních souborů, validaci formulářů, omezeních databázových dokumentů a automatizovaném testování. Nástroje jako Ajv (JavaScript), jsonschema (Python) a check-jsonschema (CLI) implementují specifikaci a umožňují programatickou validaci dat. Tento online validátor vám umožní vložit schéma i datový dokument a okamžitě ověřit shodu, bez instalace jakékoliv knihovny.
Proč používat online validátor JSON Schema?
Psaní schémat a ruční ladění chyb validace je pomalé. Online validátor JSON Schema vám poskytne okamžitou zpětnou vazbu, zda vaše data odpovídají schématu, s jasnými chybovými zprávami ukazujícími přesně na vlastnost, která selhala.
Případy použití validace JSON Schema
Přehled klíčových slov JSON Schema
JSON Schema se skládá z klíčových slov, z nichž každé ukládá omezení na validovaná data. Tabulka níže uvádí nejpoužívanější klíčová slova v Draft 7 a novějších. Každé klíčové slovo lze kombinovat s ostatními ve stejném objektu schématu.
| Klíčové slovo | Účel | Příklad |
|---|---|---|
| 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" } } } |
Srovnání verzí JSON Schema: Draft 7 vs 2019-09 vs 2020-12
JSON Schema prošla několika verzemi návrhů. Draft 7 (publikovaný v roce 2018) má nejširší podporu v nástrojích. Draft 2019-09 zavedl $defs (nahrazující definitions), unevaluatedProperties a $recursiveRef. Draft 2020-12 (nejnovější stabilní vydání) nahradil $recursiveRef za $dynamicRef a zavedl prefixItems pro validaci n-tic. Při výběru verze ověřte, zda ji vaše validační knihovna podporuje. Ajv podporuje všechny tři verze. Knihovna jsonschema pro Python podporuje Draft 2020-12 od verze 4.0.
| Funkce | 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 |
Příklady kódu
Tyto příklady ukazují, jak programaticky validovat JSON oproti schématu. Každý využívá dobře udržovanou knihovnu pro dané jazykové prostředí.
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