JSON Toolkit

draft-07, nebo 2020-12

Shrnutí: 2020-12 je aktuální a přidává `$defs`, `prefixItems` a `unevaluatedProperties`, ale mnoho nástrojů stále umí jen draft-07. Vybírejte podle toho, co podporuje celý váš nástrojový řetězec.

Pokročilý~4 min čteníPublikováno 2026-10-30Aktualizováno 2026-10-30
Rozdíly mezi návrhy JSON Schema a jak volit

Stručně: pro nové projekty použijte 2020-12, přepněte se na draft-07 ve chvíli, kdy jakýkoli validátor, generátor kódu nebo nástroj OpenAPI podporuje jen ten, a vždy zafixujte návrh pomocí $schema.

Krátká odpověď: 2020-12 pro novou práci, draft-07, když to vynutí stará složka.

Časová osa

Návrh Rok Pozoruhodné
draft-04 2013 id místo $id; stále běžný ve starších API
draft-06 2017 const, propertyNames
draft-07 2018 if/then/else, readOnly, contentMediaType; nejlepší kompatibilita
2019-09 2019 $defs nahrazuje definitions, unevaluatedProperties
2020-12 2020 prefixItems, $dynamicRef; aktuální doporučení

Co 2020-12 zlepšuje

N-tice polí přestávají být speciálním případem. draft-07 vyjadřuje „první prvek je A, druhý je B“ pomocí items: [{...}, {...}] plus additionalItems. 2020-12 používá prefixItems pro schémata specifická podle pozice a items pro zbytek.

$defs je standardní název. Nástroje psané po roce 2019 tam hledají ve výchozím nastavení.

unevaluatedProperties funguje s kompozicí. S allOf odmítne additionalProperties: false pole definovaná sourozeneckými větvemi. unevaluatedProperties: false uvažuje jen vlastnosti skutečně vyhodnocené celým schématem, což je přesně to, co kompozice potřebuje.

Kdy je draft-07 správnou odpovědí

Situace Důvod
OpenAPI 3.0 Jeho objekt schématu je podmnožinou draft-04/07
Starší validátory (ajv 6, některé Java knihovny) Neznají prefixItems ani $dynamicRef
Platforma nařizuje verzi Některé low-code platformy a brány ji zafixují
Generátory kódu, které končí u 07 Neznámá klíčová slova se tiše ignorují

Poslední případ otestujte přímo: předejte validátoru schéma s prefixItems. Pokud projde bez stížnosti, místo aby nahlásil neznámé klíčové slovo, omezení ignoruje – což je nejnebezpečnější výsledek ze všech.

Míchání verzí

Vždy deklarujte $schema. Výchozí hodnoty se liší: ajv předpokládá draft-07, několik Python knihoven předpokládá 2020-12. Stejný soubor se pak na dvou místech validuje odlišně.

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

Nedělejte $ref napříč návrhy. Chování je nedefinované.

Upgradujte v dávkách. Dva návrhy v jednom repozitáři mění „která pravidla tady platí“ v kmenové znalosti.

Časté dotazy

Jak zjistit, zda můj validátor podporuje 2020-12?

Předejte validátoru schéma, které používá prefixItems. Chyba neznámého klíčového slova znamená, že návrh nepodporuje; tiché projítí znamená, že omezení ignoruje, což je horší.

Proč má jeden projekt používat jediný návrh?

Dva návrhy v jednom repozitáři mění „která pravidla tady platí“ v kmenové znalosti. Upgradujte v dávkách, aby každý soubor sdílel stejnou interpretaci.

Mám vždy deklarovat $schema?

Ano. Výchozí hodnoty se liší: ajv předpokládá draft-07, zatímco několik Python knihoven předpokládá 2020-12, takže stejný soubor se na dvou místech může validovat odlišně.

Další čtení