JSON Toolkit

draft-07 ou 2020-12

L’essentiel : 2020-12 est la version courante et ajoute $defs, prefixItems et unevaluatedProperties, mais beaucoup d'outils ne parlent encore que draft-07. Choisissez selon ce que toute votre chaîne d'outils prend en charge.

Avancé~4 min de lecturePublié le 2026-10-30Mis à jour le 2026-10-30
Différences entre les drafts JSON Schema et comment choisir

L'essentiel : utilisez 2020-12 pour les nouveaux projets, repassez à draft-07 dès qu'un validateur, générateur de code ou outil OpenAPI ne le prend en charge que lui, et épinglez toujours le draft avec $schema.

Réponse courte : 2020-12 pour les nouveaux travaux, draft-07 quand un vieux composant l'impose.

Chronologie

Draft Année Notable
draft-04 2013 id au lieu de $id ; encore courant dans les anciennes API
draft-06 2017 const, propertyNames
draft-07 2018 if/then/else, readOnly, contentMediaType ; meilleure compatibilité
2019-09 2019 $defs remplace definitions, unevaluatedProperties
2020-12 2020 prefixItems, $dynamicRef ; recommandation actuelle

Ce que 2020-12 améliore

Les tuples de tableau cessent d'être un cas spécial. draft-07 exprime « le premier élément est A, le second est B » avec items: [{...}, {...}] plus additionalItems. 2020-12 utilise prefixItems pour les schémas spécifiques à la position et items pour le reste.

$defs est le nom standard. L'outillage écrit après 2019 regarde là par défaut.

unevaluatedProperties fonctionne avec la composition. Avec allOf, additionalProperties: false rejette les champs définis par des branches sœurs. unevaluatedProperties: false ne considère que les propriétés réellement évaluées par tout le schéma, ce dont la composition a besoin.

Quand draft-07 est la bonne réponse

Situation Raison
OpenAPI 3.0 Son objet de schéma est un sous-ensemble draft-04/07
Validateurs plus anciens (ajv 6, certaines bibliothèques Java) Ils ne connaissent pas prefixItems ni $dynamicRef
Une plateforme impose une version Certaines plateformes low-code et passerelles l'épinglent
Générateurs de code qui s'arrêtent à 07 Les mots-clés inconnus sont ignorés silencieusement

Testez le dernier cas directement : donnez un schéma prefixItems à votre validateur. S'il passe sans se plaindre au lieu de rapporter un mot-clé inconnu, il ignore la contrainte — le résultat le plus dangereux de tous.

Mélanger les versions

Déclarez toujours $schema. Les défauts diffèrent : ajv suppose draft-07, plusieurs bibliothèques Python supposent 2020-12. Le même fichier valide alors différemment à deux endroits.

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

Ne faites pas de $ref entre drafts. Le comportement est indéfini.

Mettez à niveau par lots. Deux drafts dans un même dépôt transforment « quelles règles s'appliquent ici » en connaissance tribale.

FAQ

Comment vérifier si mon validateur prend en charge 2020-12 ?

Donnez un schéma qui utilise prefixItems au validateur. Une erreur de mot-clé inconnu signifie qu'il ne prend pas en charge le draft ; passer silencieusement signifie qu'il ignore la contrainte, ce qui est pire.

Pourquoi un projet devrait-il utiliser un seul draft ?

Deux drafts dans un même dépôt transforment « quelles règles s'appliquent ici » en connaissance tribale. Mettez à niveau par lots pour que chaque fichier partage la même interprétation.

Faut-il toujours déclarer $schema ?

Oui. Les défauts diffèrent : ajv suppose draft-07 tandis que plusieurs bibliothèques Python supposent 2020-12, donc le même fichier peut valider différemment à deux endroits.

Lectures complémentaires