Що таке валідація JSON Schema?
Валідація JSON Schema — це процес перевірки того, чи відповідає JSON-документ набору структурних обмежень і обмежень на значення, визначених у JSON Schema. Сама схема є JSON-документом, що описує очікувану форму ваших даних: які властивості є обов'язковими, яких типів вони мають бути, допустимі діапазони чисел, шаблони рядків, довжини масивів тощо. Специфікація JSON Schema підтримується на json-schema.org і публікується у вигляді серії чернеток IETF; найширше застосування отримали Draft 7 і Draft 2020-12.
Тоді як звичайна валідація JSON перевіряє лише синтаксис (чи правильно розставлені дужки? чи взяті рядки в лапки?), валідація за схемою йде далі. Вона відповідає на запитання: чи завжди містить відповідь цього API поле "id" цілочисельного типу? Чи є значення поля "status" одним із трьох допустимих? Чи правильно структуровані вкладені об'єкти? Такий структурний контроль виявляє помилки, які синтаксична перевірка пропускає, адже синтаксично коректний JSON може бути семантично невірним для вашого застосунку.
JSON Schema використовується у визначеннях OpenAPI/Swagger, валідації конфігураційних файлів, валідації форм, обмеженнях документів у базах даних і в автоматизованому тестуванні. Інструменти на кшталт Ajv (JavaScript), jsonschema (Python) і check-jsonschema (CLI) реалізують специфікацію, дозволяючи перевіряти дані програмно. Цей онлайн-валідатор дає змогу вставити схему і документ із даними та миттєво перевірити їх відповідність — без встановлення будь-яких бібліотек.
Навіщо використовувати онлайн-валідатор JSON Schema?
Писати схеми й налагоджувати помилки валідації вручну — повільно. Онлайн-валідатор JSON Schema надає миттєвий зворотний зв'язок щодо відповідності ваших даних схемі, із чіткими повідомленнями про помилки, що вказують на конкретну властивість, яка не пройшла перевірку.
Сценарії використання валідації JSON Schema
Довідник ключових слів JSON Schema
JSON Schema будується з ключових слів, кожне з яких накладає обмеження на дані, що перевіряються. Таблиця нижче містить найпоширеніші ключові слова Draft 7 і пізніших версій. Будь-яке ключове слово можна поєднувати з іншими в одному об'єкті схеми.
| Ключове слово | Призначення | Приклад |
|---|---|---|
| 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" } } } |
Порівняння версій JSON Schema: Draft 7, 2019-09 і 2020-12
JSON Schema пройшла кілька версій чернеток. Draft 7 (опублікований у 2018 році) має найширшу підтримку серед інструментів. Draft 2019-09 запровадив $defs (замість definitions), unevaluatedProperties і $recursiveRef. Draft 2020-12 (найостанніший стабільний випуск) замінив $recursiveRef на $dynamicRef і запровадив prefixItems для валідації кортежів. Вибираючи версію чернетки, перевіряйте, чи підтримує її ваша бібліотека валідації. Ajv підтримує всі три версії. Бібліотека jsonschema для Python підтримує до 2020-12, починаючи з версії 4.0.
| Можливість | 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 |
Приклади коду
Ці приклади демонструють, як перевіряти JSON за схемою програмно. Кожен використовує добре підтримувану бібліотеку для свого мовного екосистемного середовища.
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