Что такое валидация по 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 Validator?
Создание схем и отладка ошибок валидации вручную — занятие медленное. Онлайн JSON Schema Validator даёт мгновенную обратную связь: соответствуют ли ваши данные схеме, с чёткими сообщениями об ошибках, указывающими на конкретное проблемное поле.
Сценарии использования JSON Schema Validator
Справочник по ключевым словам 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 vs 2019-09 vs 2020-12
JSON Schema прошла через несколько версий черновиков. Draft 7 (опубликован в 2018 году) имеет наибольшую поддержку среди инструментов. Draft 2019-09 ввёл $defs (на замену definitions), unevaluatedProperties и $recursiveRef. Draft 2020-12 (последний стабильный выпуск) заменил $recursiveRef на $dynamicRef и добавил prefixItems для валидации кортежей. При выборе черновика проверьте, поддерживает ли его ваша библиотека валидации. Ajv поддерживает все три черновика. Библиотека jsonschema для Python поддерживает Draft 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