JSON Toolkit

draft-07 oder 2020-12

Fazit: 2020-12 ist aktuell und bringt $defs, prefixItems und unevaluatedProperties, aber viele Werkzeuge sprechen nur draft-07. Wählen Sie nach dem, was Ihre gesamte Toolchain unterstützt.

Experte~4 Min. LesezeitVeröffentlicht 2026-10-30Aktualisiert 2026-10-30
Unterschiede zwischen JSON-Schema-Drafts und die Auswahl

Kurz gesagt: Verwenden Sie 2020-12 für neue Projekte, fallen Sie auf draft-07 zurück, sobald irgendein Validator, Codegenerator oder OpenAPI-Werkzeug nur es unterstützt, und nageln Sie den Draft immer mit $schema fest.

Kurze Antwort: 2020-12 für neue Arbeit, draft-07, wenn eine alte Komponente es erzwingt.

Zeitleiste

Draft Jahr Bemerkenswertes
draft-04 2013 id statt $id; in älteren APIs noch verbreitet
draft-06 2017 const, propertyNames
draft-07 2018 if/then/else, readOnly, contentMediaType; beste Kompatibilität
2019-09 2019 $defs ersetzt definitions, unevaluatedProperties
2020-12 2020 prefixItems, $dynamicRef; aktuelle Empfehlung

Was 2020-12 verbessert

Array-Tupel sind kein Sonderfall mehr. draft-07 drückt „erstes Element ist A, zweites ist B“ mit items: [{...}, {...}] plus additionalItems aus. 2020-12 verwendet prefixItems für positionsspezifische Schemas und items für den Rest.

$defs ist der Standardname. Nach 2019 geschriebene Tooling sucht standardmäßig dort.

unevaluatedProperties funktioniert mit Komposition. Mit allOf weist additionalProperties: false Felder zurück, die von Schwester-Zweigen definiert werden. unevaluatedProperties: false berücksichtigt nur Eigenschaften, die tatsächlich vom gesamten Schema ausgewertet wurden, was Komposition braucht.

Wann draft-07 die richtige Antwort ist

Situation Grund
OpenAPI 3.0 Sein Schemaobjekt ist eine draft-04/07-Teilmenge
Ältere Validatoren (ajv 6, manche Java-Bibliotheken) Sie kennen prefixItems oder $dynamicRef nicht
Plattform schreibt eine Version vor Manche Low-Code-Plattformen und Gateways nageln sie fest
Codegeneratoren, die bei 07 enden Unbekannte Schlüsselwörter werden stillschweigend ignoriert

Testen Sie den letzten Fall direkt: Geben Sie Ihrem Validator ein prefixItems-Schema. Geht es ohne Beschwerde durch, statt ein unbekanntes Schlüsselwort zu melden, ignoriert es die Beschränkung – das gefährlichste Ergebnis von allen.

Versionen mischen

$schema immer deklarieren. Standards unterscheiden sich: ajv nimmt draft-07 an, mehrere Python-Bibliotheken nehmen 2020-12 an. Dieselbe Datei validiert dann an zwei Stellen unterschiedlich.

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

Kein $ref über Drafts hinweg. Das Verhalten ist undefiniert.

In Batches aktualisieren. Zwei Drafts in einem Repository machen aus „welche Regeln gelten hier“ Stammeswissen.

FAQ

Wie prüfe ich, ob mein Validator 2020-12 unterstützt?

Geben Sie dem Validator ein Schema, das prefixItems verwendet. Ein Fehler über ein unbekanntes Schlüsselwort bedeutet, dass er den Draft nicht unterstützt; stilles Durchgehen bedeutet, dass er die Beschränkung ignoriert, was schlimmer ist.

Warum sollte ein Projekt einen einzigen Draft verwenden?

Zwei Drafts in einem Repository machen aus „welche Regeln gelten hier“ Stammeswissen. Aktualisieren Sie in Batches, damit jede Datei dieselbe Interpretation teilt.

Sollte ich immer $schema deklarieren?

Ja. Standards unterscheiden sich: ajv nimmt draft-07 an, während mehrere Python-Bibliotheken 2020-12 annehmen, dieselbe Datei kann also an zwei Stellen unterschiedlich validieren.

Weiterführende Literatur