100 % local — vos données ne quittent jamais votre navigateur

JSON en JSON Schema — un contrat pour la CI

Transformez un échantillon JSON en JSON Schema 2020-12. Clés requises et additionalProperties sont des interrupteurs : le contrat dit ce que vous voulez.

Instantané Privé Zéro cookie
Indentation

Entrée JSON

Sortie JSON Schema

Ce que fait cet outil

Un échantillon JSON devient un JSON Schema en draft 2020-12.

{ "id": 1, "name": "Ada", "address": { "city": "Paris" } }
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": { "type": "integer" },
    "name": { "type": "string" },
    "address": {
      "type": "object",
      "properties": { "city": { "type": "string" } },
      "required": ["city"]
    }
  },
  "required": ["id", "name", "address"]
}

Les objets imbriqués sont écrits sur place. Pas de section $defs, pas de $ref : pour un échantillon, un schéma en ligne est celui qui se lit de haut en bas.

Deux réglages, parce que les deux réponses se défendent

  • Clés requises. Actif par défaut : chaque clé de l’échantillon est listée. Inactif : aucun tableau required, et un document auquel il manque une clé valide quand même.
  • additionalProperties. Permissif par défaut — une clé en trop passe. En strict, "additionalProperties": false est ajouté à chaque objet et une clé inattendue devient une erreur.

Aucun de ces choix ne se lit dans un échantillon. Ce sont des affirmations sur votre API : elles vous reviennent, plutôt que d’être devinées ici.

integer et number viennent du littéral

3 donne integer ; 3.0 et 1e3 donnent number. JSON n’a qu’un type numérique : la façon dont un nombre est écrit est la seule trace de ce qui l’a produit. Un schéma appelant 10.0 un entier refuse 10.5, très probablement l’enregistrement suivant — c’est exactement ce que faisait cet outil jusqu’à ce que le défaut soit trouvé et corrigé en écrivant ces pages.

Ce que l’échantillon ne décrit pas

  • "n": null donne {"type": "null"}, un schéma qui n’accepte rien d’autre. Si le champ est une chaîne nullable, la retouche est {"type": ["string", "null"]}.
  • Un tableau vide donne {"type": "array"} sans items : rien n’est affirmé sur des éléments jamais vus.
  • Un tableau hétérogène donne anyOf, listant exactement les formes présentes.
  • Ni format, ni minLength, ni pattern. Un courriel, un UUID et une phrase sont tous "type": "string" ici. Ajouter "format": "email" serait deviner un sens, pas lire une structure — et c’est la première chose à ajouter à la main quand vous connaissez le champ.

Confidentiel par conception

Tout s’exécute localement dans votre navigateur en JavaScript. Vos données ne sont jamais envoyées sur un serveur, ce qui rend l’outil sûr pour des contenus sensibles, et il fonctionne hors ligne.

Questions fréquentes

Pourquoi tout est-il dans `required` ?
Parce que chaque clé était dans l’échantillon, et c’est la seule affirmation que le document permette. C’est aussi un réglage : désactivez-le et aucun tableau `required` n’est émis. Le laisser actif donne un schéma qui échoue bruyamment sur une clé manquante, ce qui est le plus souvent le meilleur point de départ.
Pourquoi n’y a-t-il pas de section `$defs` ?
Parce que le schéma est écrit en ligne : les objets imbriqués figurent là où ils apparaissent, même si la même forme revient deux fois. Cela se lit mieux pour un échantillon et valide à l’identique. Si vous factorisez un gros schéma, déplacer les sous-schémas répétés dans `$defs` avec `$ref` est une retouche qui vaut la peine.
Qu’est-ce qui départage `integer` et `number` ?
Le littéral. `3` donne `integer`, `3.0` et `1e3` donnent `number`, parce que JSON n’a qu’un type numérique et que la forme écrite est le seul témoignage de l’original. Un schéma qui dirait `10.0` entier refuserait `10.5` — l’enregistrement suivant — ce que cet outil faisait jusqu’à sa correction.

Convertisseurs associés