Отличия между драфтами

JSON Schema развивается через набор формальных редакций (drafts), каждая из которых расширяет набор возможностей и уточняет семантику валидации. В Ajv поддержка различных драфтов реализована как один из ключевых механизмов совместимости, поскольку поведение валидатора напрямую зависит от выбранной спецификации.

Разные версии JSON Schema отличаются не только набором ключевых слов, но и моделью обработки данных. Более ранние драфты ориентированы на простые проверки структуры, тогда как поздние вводят композиционные правила, более строгую семантику и расширенные механизмы вывода ошибок.

В контексте Ajv драфт определяет:

  • набор поддерживаемых ключевых слов;
  • правила интерпретации логических конструкций;
  • поведение при неизвестных или лишних свойствах;
  • уровень строгой типизации и валидации.

Draft-04: базовая модель схем

Draft-04 долгое время оставался наиболее распространённым стандартом. Его модель проста и предсказуема, что делает его удобным для начальных систем валидации.

Основные характеристики:

  • поддержка type, properties, required, additionalProperties;
  • ограниченные логические конструкции (anyOf, oneOf, allOf);
  • отсутствие развитых механизмов контроля контекста.

Особенности поведения:

  • required описывается массивом строк;
  • additionalProperties работает как основной механизм ограничения расширений объектов;
  • отсутствуют современные ключевые слова вроде if/then/else и unevaluatedProperties.

В Ajv этот драфт часто используется в проектах, где важна максимальная совместимость со старыми спецификациями или внешними API.


Draft-06: расширение выразительности

Draft-06 добавляет значимые улучшения в выразительность схем, не ломая обратную совместимость.

Ключевые изменения:

  • введение const как строгого эквивалента единственного допустимого значения;
  • расширение возможностей examples (в некоторых реализациях);
  • уточнение поведения contains в массивах;
  • улучшенная семантика propertyNames.

Особое значение имеет усиление контроля над массивами. contains начинает вести себя более предсказуемо в сочетании с minItems и maxItems, что позволяет точнее описывать структуру коллекций.

В Ajv этот драфт стал промежуточной ступенью к более строгой модели 07 и 2019-09.


Draft-07: стабилизация и практическое расширение

Draft-07 считается одним из наиболее используемых стандартов в реальных проектах благодаря балансу между сложностью и функциональностью.

Основные добавления:

  • полноценная поддержка if, then, else;
  • более строгая работа contains;
  • введение propertyNames как полноценного механизма валидации ключей объекта;
  • улучшение поведения dependencies (позднее переработано в новых драфтах).

Особенность логических конструкций:

  • if не возвращает значение, а управляет выбором схем;
  • then и else применяются условно;
  • допускается вложенность условных правил, что позволяет строить сложные правила бизнес-логики.

В Ajv именно Draft-07 стал базой для широкого промышленного использования до появления спецификаций 2019-09.


Draft-2019-09: модульная модель и переработка ключевых слов

Переход к 2019-09 стал качественным изменением архитектуры JSON Schema. Главная идея — разделение спецификации на модули vocabularies.

Модульная система словарей

Теперь набор ключевых слов не фиксирован жёстко, а определяется набором подключённых словарей:

  • Core vocabulary;
  • Applicator vocabulary;
  • Validation vocabulary;
  • Format vocabulary.

Это позволяет реализаторам, включая Ajv, более гибко управлять функциональностью.


Новые ключевые слова и изменения

  • dependentRequired заменяет и уточняет поведение старых dependencies;
  • dependentSchemas позволяет задавать целые схемы в зависимости от наличия свойства;
  • введён unevaluatedProperties, закрывающий одну из главных проблем старых драфтов;
  • улучшена логика if/then/else в сочетании с новой моделью оценки.

Unevaluated-проверки

unevaluatedProperties и unevaluatedItems становятся ключевым инструментом строгой валидации:

  • позволяют запрещать неучтённые свойства после всех применённых схем;
  • решают проблему “остаточных” полей в сложных композициях;
  • работают поверх результатов всех applicator-ключевых слов.

В Ajv это потребовало переработки механизма оценки схем, так как теперь важно учитывать не только локальную, но и глобальную оценку свойств.


Draft-2020-12: финальная консолидация модели

Draft-2020-12 развивает модель 2019-09 и фиксирует ряд поведенческих аспектов.

Уточнение логики применения схем

  • поведение allOf, anyOf, oneOf становится более предсказуемым при вложенности;
  • усиливается формализация результата валидации;
  • уточняется взаимодействие unevaluatedProperties с композиционными конструкциями.

Новые и переработанные механизмы

  • улучшена модель $dynamicRef и $dynamicAnchor, обеспечивающая более гибкие ссылки в больших схемах;
  • пересмотрено поведение $recursiveRef и $recursiveAnchor;
  • оптимизирована работа ссылочной системы $ref.

Поведенческие различия в Ajv при смене драфта

Ajv интерпретирует схемы строго в рамках выбранного стандарта. Это приводит к ряду критичных различий:

1. Доступные ключевые слова

В старых драфтах:

  • отсутствие unevaluatedProperties;
  • отсутствие dependentSchemas;
  • ограниченная условная логика.

В новых:

  • расширенный набор аппликаторов;
  • поддержка сложных зависимостей.

2. Строгость валидации

С повышением версии драфта:

  • уменьшается количество “неопределённого поведения”;
  • усиливается контроль над лишними данными;
  • повышается предсказуемость результата валидации.

3. Обработка свойств объекта

В Draft-04:

  • контроль осуществляется в основном через additionalProperties.

В 2019-09 и 2020-12:

  • контроль распределён между properties, patternProperties, additionalProperties, unevaluatedProperties;
  • появляется пост-оценка всех схем.

4. Композиционные схемы

Сложные конструкции (allOf, oneOf, anyOf) в новых драфтах:

  • корректно учитывают побочные эффекты других схем;
  • взаимодействуют с unevaluated-механизмами;
  • требуют более глубокого анализа результата валидации.

Практическое влияние выбора драфта в Ajv

Выбор драфта определяет не только синтаксис схем, но и архитектурные ограничения проекта:

  • старые драфты проще в отладке, но ограничены по выразительности;
  • новые драфты позволяют моделировать сложные доменные правила;
  • переход между драфтами может изменять поведение одной и той же схемы без изменения кода.

Ajv решает эту проблему через явную настройку версии спецификации, что делает поведение предсказуемым, но требует строгого контроля совместимости схем.