JSON Schema развивается через набор формальных редакций (drafts), каждая из которых расширяет набор возможностей и уточняет семантику валидации. В Ajv поддержка различных драфтов реализована как один из ключевых механизмов совместимости, поскольку поведение валидатора напрямую зависит от выбранной спецификации.
Разные версии JSON Schema отличаются не только набором ключевых слов, но и моделью обработки данных. Более ранние драфты ориентированы на простые проверки структуры, тогда как поздние вводят композиционные правила, более строгую семантику и расширенные механизмы вывода ошибок.
В контексте Ajv драфт определяет:
Draft-04 долгое время оставался наиболее распространённым стандартом. Его модель проста и предсказуема, что делает его удобным для начальных систем валидации.
Основные характеристики:
type, properties,
required, additionalProperties;anyOf,
oneOf, allOf);Особенности поведения:
required описывается массивом строк;additionalProperties работает как основной механизм
ограничения расширений объектов;if/then/else и unevaluatedProperties.В Ajv этот драфт часто используется в проектах, где важна максимальная совместимость со старыми спецификациями или внешними API.
Draft-06 добавляет значимые улучшения в выразительность схем, не ломая обратную совместимость.
Ключевые изменения:
const как строгого эквивалента единственного
допустимого значения;examples (в некоторых
реализациях);contains в массивах;propertyNames.Особое значение имеет усиление контроля над массивами.
contains начинает вести себя более предсказуемо в сочетании
с minItems и maxItems, что позволяет точнее
описывать структуру коллекций.
В Ajv этот драфт стал промежуточной ступенью к более строгой модели 07 и 2019-09.
Draft-07 считается одним из наиболее используемых стандартов в реальных проектах благодаря балансу между сложностью и функциональностью.
Основные добавления:
if, then,
else;contains;propertyNames как полноценного механизма
валидации ключей объекта;dependencies (позднее переработано
в новых драфтах).Особенность логических конструкций:
if не возвращает значение, а управляет выбором
схем;then и else применяются условно;В Ajv именно Draft-07 стал базой для широкого промышленного использования до появления спецификаций 2019-09.
Переход к 2019-09 стал качественным изменением архитектуры JSON Schema. Главная идея — разделение спецификации на модули vocabularies.
Теперь набор ключевых слов не фиксирован жёстко, а определяется набором подключённых словарей:
Это позволяет реализаторам, включая Ajv, более гибко управлять функциональностью.
dependentRequired заменяет и уточняет поведение старых
dependencies;dependentSchemas позволяет задавать целые схемы в
зависимости от наличия свойства;unevaluatedProperties, закрывающий одну из
главных проблем старых драфтов;if/then/else в сочетании с новой
моделью оценки.unevaluatedProperties и unevaluatedItems
становятся ключевым инструментом строгой валидации:
В Ajv это потребовало переработки механизма оценки схем, так как теперь важно учитывать не только локальную, но и глобальную оценку свойств.
Draft-2020-12 развивает модель 2019-09 и фиксирует ряд поведенческих аспектов.
allOf, anyOf, oneOf
становится более предсказуемым при вложенности;unevaluatedProperties с
композиционными конструкциями.$dynamicRef и
$dynamicAnchor, обеспечивающая более гибкие ссылки в
больших схемах;$recursiveRef и
$recursiveAnchor;$ref.Ajv интерпретирует схемы строго в рамках выбранного стандарта. Это приводит к ряду критичных различий:
В старых драфтах:
unevaluatedProperties;dependentSchemas;В новых:
С повышением версии драфта:
В Draft-04:
additionalProperties.В 2019-09 и 2020-12:
properties,
patternProperties, additionalProperties,
unevaluatedProperties;Сложные конструкции (allOf, oneOf,
anyOf) в новых драфтах:
Выбор драфта определяет не только синтаксис схем, но и архитектурные ограничения проекта:
Ajv решает эту проблему через явную настройку версии спецификации, что делает поведение предсказуемым, но требует строгого контроля совместимости схем.