JSON Toolkit

draft-07 чи 2020-12

Головне: 2020-12 — чинна й додає $defs, prefixItems і unevaluatedProperties, але багато інструментів усе ще знають лише draft-07. Обирайте за тим, що підтримує весь ваш інструментарій.

Просунутий~4 хв читанняОпубліковано 2026-10-30Оновлено 2026-10-30
Відмінності між чернетками JSON Schema і як обирати

Коротко: використовуйте 2020-12 для нових проєктів, відкочуйтеся до draft-07 щойно якийсь валідатор, генератор коду чи інструмент OpenAPI підтримує лише його, і завжди закріплюйте чернетку через $schema.

Коротка відповідь: 2020-12 для нової роботи, draft-07 коли старий компонент змушує.

Хронологія

Чернетка Рік Примітне
draft-04 2013 id замість $id; досі поширена в старіших API
draft-06 2017 const, propertyNames
draft-07 2018 if/then/else, readOnly, contentMediaType; найкраща сумісність
2019-09 2019 $defs замінює definitions, unevaluatedProperties
2020-12 2020 prefixItems, $dynamicRef; чинна рекомендація

Що покращує 2020-12

Кортежі масивів перестають бути особливим випадком. draft-07 виражає «перший елемент — A, другий — B» через items: [{...}, {...}] плюс additionalItems. 2020-12 використовує prefixItems для схем, специфічних за позицією, і items для решти.

$defs — стандартна назва. Інструментарій, написаний після 2019, типово шукає там.

unevaluatedProperties працює з композицією. З allOf additionalProperties: false відхиляє поля, визначені сусідніми гілками. unevaluatedProperties: false враховує лише властивості, фактично обчислені всією схемою, що й потрібно композиції.

Коли draft-07 — правильна відповідь

Ситуація Причина
OpenAPI 3.0 Його обʼєкт схеми — підмножина draft-04/07
Старіші валідатори (ajv 6, деякі бібліотеки Java) Вони не знають prefixItems чи $dynamicRef
Платформа вимагає версію Деякі low-code платформи й шлюзи її закріплюють
Генератори коду, що зупиняються на 07 Невідомі ключові слова ігноруються мовчки

Перевірте останній випадок безпосередньо: подайте схему з prefixItems вашому валідатору. Якщо вона проходить без скарг, а не повідомляє про невідоме ключове слово, він ігнорує обмеження — найнебезпечніший результат із усіх.

Змішування версій

Завжди оголошуйте $schema. Типові значення різняться: ajv припускає draft-07, кілька бібліотек Python припускають 2020-12. Той самий файл тоді перевіряється по-різному в двох місцях.

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.com/schemas/order.json",
  "type": "object"
}

Не робіть $ref між чернетками. Поведінка невизначена.

Оновлюйте пакетами. Дві чернетки в одному репозиторії перетворюють «які правила тут застосовуються» на племінне знання.

Часті питання

Як перевірити, чи мій валідатор підтримує 2020-12?

Подайте валідатору схему, що використовує prefixItems. Помилка невідомого ключового слова означає, що він не підтримує чернетку; проходження мовчки означає, що він ігнорує обмеження, що гірше.

Чому один проєкт має використовувати одну чернетку?

Дві чернетки в одному репозиторії перетворюють «які правила тут застосовуються» на племінне знання. Оновлюйте пакетами, щоб кожен файл поділяв те саме тлумачення.

Чи завжди оголошувати $schema?

Так. Типові значення різняться: ajv припускає draft-07, тоді як кілька бібліотек Python припускають 2020-12, тож той самий файл може перевірятися по-різному в двох місцях.

Додаткове читання