JSON Schema: Draft 7 vs 2019-09 vs 2020-12

Draft 7, 2019-09 a 2020-12 jsou různé dialekty JSON Schema. Změna $schema sama nepřevede schéma; některá klíčová slova změnila jméno nebo význam.

Autor: Aktualizováno

Praktické rozdíly

OblastDraft 72019-092020-12
Definice pro opakované použitídefinitions$defs$defs
Pozice v n-ticiitems jako pole schématitems jako pole schématprefixItems
Položky za n-ticíadditionalItemsadditionalItemsitems
Pravidla vedle $refignorovanávyhodnocovanávyhodnocovaná
unevaluatedProperties / Itemsneanoano
Rekurzivní rozšířeníběžné $ref$recursiveRef / $recursiveAnchor$dynamicRef / $dynamicAnchor

Pro nové schéma zvol 2020-12, pokud jej podporují všechny části tvého systému. Ve stávajícím API má přednost kompatibilita. K 1. 10. 2026 je 2020-12 aktuální publikovaná verze podle projektu JSON Schema; neznamená to automaticky podporu každé knihovny.

Migrace n-tice

Draft 7
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "array",
  "items": [
    {
      "type": "string"
    },
    {
      "type": "integer",
      "minimum": 0
    }
  ],
  "additionalItems": false,
  "minItems": 2
}
Stejná pravidla ve verzi 2020-12
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "array",
  "prefixItems": [
    {
      "type": "string"
    },
    {
      "type": "integer",
      "minimum": 0
    }
  ],
  "items": false,
  "minItems": 2
}

Obě ukázky přijmou ["Jana",20] a odmítnou jednu i tři položky. minItems je potřebné v obou. U homogenního seznamu zůstává items jako jediné schéma i v 2020-12.

Další migrační rizika

V 2019-09 se rozděluje staré dependencies na dependentRequired a dependentSchemas. Změnil se také způsob práce s formáty a vznikly slovníky. V 2020-12 se přepracovalo dynamické odkazování a položky úspěšné přes contains ovlivňují unevaluatedItems.

Přejmenování definitions na $defs musí doprovodit úprava fragmentů v $ref. Starší jména mohou implementace přijímat kvůli kompatibilitě; při psaní nového schématu používej názvy z vybrané verze. Oficiální poznámky 2019-09 a poznámky 2020-12 rozepisují změny.

Kontrolní postup migrace

  1. Ověř podporu cílového dialektu a potřebných slovníků.
  2. Uprav strukturu schématu a všechny lokální i externí odkazy.
  3. Ověř schéma proti odpovídajícímu meta schématu.
  4. Spusť původní platné i neplatné příklady a porovnej výsledky.
  5. Zkontroluj formáty, rekurzi a uzavírání složených objektů.

Pouhé ignorování neznámého slova může způsobit, že neplatná data začnou procházet. V testech proto musí být i vstupy, které každé důležité pravidlo porušují.

Zkontroluj, zda se po změně verze změnila přijatá data

Schéma n-tice z této kapitoly musí přijmout dvě hodnoty ve správném pořadí. Zkus kromě platného vstupu také ["Jana"], [20,"Jana"] a ["Jana",20,true]: všechny tři musí být odmítnuté v původní i nové verzi.

Pokud po migraci některý z těchto vstupů projde, validátor možná ignoruje nové klíčové slovo nebo schéma neobsahuje potřebné omezení délky. Změna $schema bez úpravy items a prefixItems není převod schématu. Přehled změn uvádí poznámky k 2020-12.