Необходимые cookie-файлы нужны для работы сайта. Аналитические cookie (Яндекс Метрика) — только с вашего согласия. Политика cookie-файлов

Тема оформления
Справочник

Поддерживаемый JSON Schema

Какое подмножество JSON Schema поддерживает Typizer и как работает расширение x-typizer-check.

Схема типизатора — документ JSON Schema draft 2020-12, ограниченный подмножеством, которое понимает Typizer: корень обязан быть "type": "object", а дальше — только перечисленные ниже ключевые слова. Рабочие примеры схем для счетов и УПД — в «Счета и УПД»; что означают статусы полей ok/warn/missing — в «Проверки полей».

Поддерживаемые типы

type — одно из семи базовых значений JSON Schema:

ТипЧто это
objectобъект с properties
arrayмассив, элементы описывает items
stringстрока
numberдробное или целое число
integerцелое число
booleantrue/false
nullтолько значение null

Поддерживаемые ключевые слова

Любое ключевое слово вне этого списка — ошибка unsupported_schema_feature (см. ниже).

Ключевое словоНазначение
typeтип значения (см. выше)
propertiesполя объекта и их схемы
requiredкакие из properties обязательны
itemsсхема элемента массива
enumсписок допустимых значений (не более 200, без повторов)
formatформат строки — date, date-time, email или uri
patternрегулярное выражение, которому должна соответствовать строка
minimum, maximumграницы числа
descriptionописание поля для модели — не влияет на проверку
titleзаголовок узла схемы
examplesпримеры значений, информационно
$defsпереиспользуемые определения (только в корне схемы)
$refссылка на $defs, вида #/$defs/<имя>
$schemaесли указан, должен быть ровно https://json-schema.org/draft/2020-12/schema
additionalPropertiesесли указан, должен быть ровно false — произвольный true или объект-схема не поддерживаются
x-typizer-checkрасширение Typizer: проверка реквизита (см. ниже)
x-typizer-sum-ofрасширение Typizer: сверка суммы (см. ниже)

Поле pattern компилируется движком RE2 (через RE2JS), а не встроенным RegExp: часть синтаксиса (обратные ссылки, просмотр вперёд/назад) RE2 не умеет в принципе — такой pattern будет отклонён как invalid_schema, а не просто не сработает в рантайме.

Имена полей

Имя свойства в properties (и имя записи в $defs) — юникодная буква или _, затем до 63 ещё букв, десятичных цифр, _ или - (значит, кириллица допустима наравне с латиницей: поставщик — рабочее имя поля). Имя не может быть __proto__, constructor или prototype. Это то же самое имя, что становится элементом в XML-выводе — см. «Форматы результата».

x-typizer-check: проверка реквизита

x-typizer-check на строковом (или числовом, для sum_of) поле включает проверку значения при извлечении. Допустимые значения:

  • inn — ИНН;
  • kpp — КПП;
  • ogrn — ОГРН/ОГРНИП;
  • bik — БИК;
  • account — расчётный счёт (сверяется с соседним полем БИК, если оно есть в схеме);
  • snils — СНИЛС;
  • sum_of — сходимость суммы.

Для полей inn, kpp, ogrn, bik и snils Typizer проверяет их и без явного x-typizer-check, если имя самого поля — inn, kpp, ogrn/ogrnip (в оба раза — ogrn), bik или snils (без учёта регистра); account и sum_of включаются только явным x-typizer-check. Что означают результаты (ok/warn и причина, missing) и как считается каждая проверка — в «Проверки полей».

sum_of особый: он ставится на числовое поле ("type": "number") вместе с соседним ключевым словом x-typizer-sum-of, в котором — путь к полям-слагаемым относительно объекта, держащего это числовое поле; [] в пути значит «каждый элемент массива», например:

JSON
{
  "total": {
    "type": "number",
    "x-typizer-check": "sum_of",
    "x-typizer-sum-of": "items[].amount"
  }
}

Без x-typizer-sum-of (или если type поля — не number) схема со x-typizer-check: "sum_of" отклоняется как invalid_schema.

$defs и $ref: без циклов

$defs — только в корне схемы, объект с именованными под-схемами. $ref — строка вида #/$defs/<имя> и ничего больше (внешние ссылки, ссылки на под-пути и JSON Pointer-выражения не поддерживаются); рядом с $ref разрешены только description и title, любое другое соседнее ключевое слово — unsupported_schema_feature. Каждая запись $defs проверяется сразу при валидации схемы, даже если на неё нет ни одной ссылки — так неработающее, но неиспользуемое определение не может «спрятаться». Ссылка на саму себя или на определение, которое (прямо или через цепочку $ref) ссылается обратно на неё, — ошибка invalid_schema: циклы не поддерживаются.

Что будет при неподдерживаемом ключевом слове

Два разных кода ошибки, оба со статусом 422 и param в виде JSON Pointer на место проблемы (schema#/properties/…):

  • unsupported_schema_feature — ключевое слово, тип, формат или проверка существуют в JSON Schema (или в x-typizer-*), но Typizer их не поддерживает: ключевое слово вне списка выше (oneOf, anyOf, allOf, if, patternProperties и т. д.), неподдерживаемый type или format, additionalProperties, отличный от false, $defs не в корне, неизвестный x-typizer-check;
  • invalid_schema — само значение ключевого слова некорректно: pattern, который не компилируется или длиннее 200 символов, нечисловые или нечисловые minimum/maximum, пустой или с повторами enum, сломанный или циклический $ref, схема без properties, недопустимое имя поля, превышение одного из лимитов ниже.

Лимит числа полей и другие ограничения

Схема — не больше 200 полей (MAX_SCHEMA_FIELDS): считается каждая запись properties на любом уровне, и каждое использование $ref учитывает поля своей цели заново (раскрытия не дедуплицируются). Другие ограничения, за которыми Typizer тоже следит:

ОграничениеЗначение
Глубина вложенности схемы (properties/items/$defs/$ref, корень — уровень 1)10
Число записей в $defs50
Число значений в enum200
Длина строки pattern200 символов
Размер схемы как компактного UTF-8 JSON131072 байт (128 КиБ)
Глубина вложенности самого JSON-документа схемы (включая examples)64 уровня

Схема, нарушающая любое из них, отклоняется как invalid_schema (или, для общего размера — отдельным кодом на уровне запроса) ещё до начала обработки документа.

Что дальше