Comment générer des types et des classes à partir de JSON

Le moyen le plus rapide d'obtenir les types de modèle d'une API est de les générer à partir d'une vraie réponse : collez le JSON, choisissez votre langage et copiez le code. Un générateur lit chaque valeur, décide s'il s'agit de texte, d'un entier, d'un décimal ou d'une date, et transforme les objets imbriqués en types à part entière. Ce guide explique ce qu'un tel générateur peut savoir ou non à partir d'un exemple, et ce qu'il faut vérifier avant que le code n'entre dans votre projet.

5 min de lecture

Pourquoi générer des types

Les modèles typés détectent les erreurs tôt. Quand la réponse d'une API est décrite par une interface ou une classe, votre éditeur complète les noms de champs, le compilateur repère une clé mal orthographiée, et un champ renommé apparaît comme une erreur au lieu d'un undefined ou d'un null silencieux à l'exécution. Écrire ces types à la main pour une réponse de cinquante champs sur trois niveaux d'imbrication prend du temps, et les erreurs arrivent vite.

Un générateur fait la partie répétitive en une seconde. Le résultat est un bon premier jet que vous relisez, renommez si besoin, puis validez dans votre dépôt.

Essayez ici : JSON en code

Ouvrir la page complète de l'outil

Ce qu'un générateur déduit de votre exemple

Tout vient des valeurs de votre JSON. C'est pourquoi la qualité de l'exemple compte plus que tout le reste.

Dans le JSONDéduit commeExemple
Textestring"name": "Camille"
Nombre entierint, ou long au-delà de 2 147 483 647"id": 42
Nombre avec un point décimaldouble ou float"price": 19.0
true ou falseboolean"active": true
Texte au format de date ISOtype date, si l'option est activée"created": "2026-10-27T09:30:00Z"
null dans certains élémentstype nullable"phone": null
Clé absente de certains élémentschamp optionnel"discount" dans un seul élément
Objetun nouveau type nommé"address": { ... }
Liste d'objetsliste d'un seul type fusionné"items": [ { ... }, { ... } ]

Donnez-lui un exemple varié

Un générateur ne peut décrire que ce qu'il voit. Si votre exemple contient une seule commande avec un seul article, chaque champ semble obligatoire et aucun ne semble nullable. S'il contient une liste de commandes dont certaines ont une remise et d'autres non, le champ de remise est correctement marqué comme optionnel.

Avant de générer, récupérez donc une réponse avec plusieurs éléments, idéalement avec des cas limites : un client sans numéro de téléphone, une commande sans article, un produit avec un prix décimal. Placez-les dans un même tableau au niveau principal et le générateur les fusionnera tous en un type par forme d'objet.

  • Les champs qui valent null dans tous les éléments reçoivent un type général comme unknown, object ou Any, car le vrai type n'est pas visible.
  • Les listes vides deviennent des listes d'éléments inconnus pour la même raison.
  • Un champ qui est un nombre dans un élément et du texte dans un autre devient une union en TypeScript et un type général dans les autres langages.
  • Les grands identifiants au-delà de 2^53, comme certaines clés de base de données, sont plus sûrs en texte. JavaScript ne peut pas les représenter exactement sous forme de nombres.

Noms, attributs et conventions

Les clés JSON suivent souvent le style du backend, par exemple le snake_case de Python ou de Ruby, alors que votre code client en utilise un autre. Un bon générateur renomme les champs selon la convention du langage cible et garde la clé d'origine dans un attribut, pour que la sérialisation corresponde toujours aux données.

LangageNoms des champsComment la clé JSON est conservée
TypeScriptInchangésInutile ; les clés inhabituelles sont mises entre guillemets
C#PascalCase[JsonPropertyName] ou [JsonProperty]
Pythonsnake_caseField(alias=...) dans Pydantic
GoExportés, avec ID et URLTags de struct json:"key"
JavacamelCase@JsonProperty (Jackson)
KotlincamelCase@SerialName (kotlinx.serialization)

Des types ne sont pas une validation

Une interface TypeScript disparaît à la compilation. Si l'API envoie autre chose que ce que l'interface promet, rien ne l'arrête à l'exécution. C'est la même chose pour les classes simples dans la plupart des langages : le désérialiseur remplit ce qu'il peut et laisse le reste vide.

Si les données viennent d'une source que vous ne maîtrisez pas, validez-les à leur arrivée. En Python, les modèles Pydantic le font d'office, ce qui est une bonne raison de choisir ce style dans le générateur. En TypeScript, des bibliothèques qui vérifient les données à l'exécution peuvent être écrites à partir des interfaces générées. En C#, Java et Kotlin, marquez comme obligatoires les champs qui doivent être présents et laissez le sérialiseur échouer tôt.

Une liste de contrôle avant de valider

  • Renommez le type principal Root en quelque chose de parlant, comme Order.
  • Relisez chaque champ typé unknown, object, Any ou JsonElement et remplacez-le par le vrai type.
  • Vérifiez les nombres : un prix est-il vraiment un double, ou faut-il un type décimal adapté à l'argent ?
  • Vérifiez les dates : les voulez-vous en texte, ou dans un type date avec un fuseau horaire connu ?
  • Décidez quels champs optionnels le sont vraiment et lesquels manquaient seulement par hasard dans l'exemple.
  • Fusionnez les types que le générateur a séparés uniquement parce que leurs exemples différaient légèrement.

Étape par étape

  1. Collez une réponse JSONCollez la réponse de votre API ou ouvrez un fichier .json. Une liste avec plusieurs éléments donne de meilleurs résultats.
  2. Choisissez le langageChoisissez TypeScript, C#, Python, Go, Java ou Kotlin, puis le style, comme record, dataclass ou Pydantic.
  3. Nommez le type principalRemplacez Root dans Nom du type principal par le nom utilisé dans votre projet, par exemple Order.
  4. Copiez et relisezCopiez le code ou téléchargez-le, puis parcourez la liste de contrôle de ce guide.

Questions fréquentes

Puis-je plutôt générer des types à partir d'un JSON Schema ?

Cet outil part de données JSON, pas d'un schéma. Si votre API publie un JSON Schema ou un fichier OpenAPI, un générateur basé sur le schéma donne des résultats plus précis, car le schéma indique ce qui est obligatoire.

Pourquoi un champ est-il optionnel dans mon interface TypeScript ?

Au moins un élément de votre exemple n'avait pas cette clé. Si elle est toujours présente dans les vraies données, retirez le point d'interrogation ou ajoutez un élément complet à l'exemple.

Faut-il un double pour les montants d'argent ?

Pour les calculs monétaires, un type décimal comme decimal en C# ou BigDecimal en Java évite les erreurs d'arrondi. Un générateur ne voit qu'un nombre avec un point décimal, changez donc le type vous-même.

Que deviennent les clés avec des espaces ou des tirets ?

Elles sont converties en noms valides dans chaque langage, et la clé d'origine est conservée dans un attribut, un tag ou un alias. En TypeScript, la clé est simplement mise entre guillemets.

Mon JSON est-il envoyé quand je génère du code ici ?

Non. Le générateur fonctionne dans votre navigateur, les réponses qui contiennent des données privées restent donc sur votre appareil.