JSON vers Python

Générer des dataclasses Python depuis du JSON

Essayer un exemple
Nom de la classe racine :

Entrée JSON

Sortie Python

Fonctionne localement · Sûr pour coller des secrets
Les dataclasses Python apparaîtront ici…

Qu'est-ce que la conversion JSON vers dataclass Python ?

La conversion JSON vers dataclass Python prend un objet JSON brut et produit un ensemble de définitions de dataclasses Python avec des annotations de types précises. Le module dataclasses de Python, introduit dans la PEP 557 (Python 3.7), génère automatiquement les méthodes __init__, __repr__ et __eq__ à partir des champs annotés de la classe. Lorsque vous travaillez avec des API JSON, des fichiers de configuration ou des files de messages, les dataclasses donnent à vos données une structure typée que les éditeurs et les vérificateurs de types comme mypy peuvent contrôler dès le développement.

La fonction json.loads() de Python retourne des dicts et des listes simples. Cela fonctionne, mais sans aucune information de type : une clé mal orthographiée retourne None au lieu de lever une erreur, et votre éditeur ne peut pas autocompléter les noms de champs. Les dataclasses résolvent ce problème en associant chaque clé JSON à un champ nommé et typé. Les objets JSON imbriqués deviennent des définitions de dataclasses séparées, les tableaux deviennent des annotations List[T], et les valeurs nulles deviennent Optional[T] avec une valeur par défaut None.

Écrire ces définitions à la main est un travail mécanique. Vous lisez le JSON, déduisez le type de chaque champ depuis sa valeur, convertissez les clés camelCase ou snake_case selon les conventions Python, et gérez les cas particuliers comme les champs nullables et les tableaux à types mixtes. Un convertisseur fait tout cela en quelques millisecondes. Vous collez du JSON, vous obtenez du code de dataclass correct, et vous passez à la suite.

Pourquoi utiliser un convertisseur JSON vers Python ?

Traduire manuellement des structures JSON en définitions de classes Python implique de deviner les types à partir d'exemples de données, de réordonner les champs pour que les champs obligatoires précèdent les champs optionnels, et de tout mettre à jour à chaque modification d'API. Un convertisseur supprime toutes ces frictions.

Génération instantanée de dataclasses
Collez votre JSON et obtenez des définitions de dataclasses Python typées en moins d'une seconde. Les objets imbriqués, les listes et les champs optionnels sont gérés automatiquement.
🔒
Traitement respectueux de la confidentialité
La conversion s'exécute entièrement dans votre navigateur via JavaScript. Votre JSON ne quitte jamais votre machine. Les clés d'API, tokens et données utilisateurs restent privés.
📝
Annotations de types correctes
Chaque champ généré inclut une annotation de type Python déduite de la valeur JSON : str, int, float, bool, List[T] ou Optional[T] pour les valeurs nulles.
📦
Sans installation ni inscription
Ouvrez la page et collez votre JSON. Aucun environnement Python requis, aucun paquet pip à installer, aucun compte à créer.

Cas d'usage du JSON vers Python

Développement de clients d'API REST
Générez des dataclasses depuis des exemples de réponses d'API. Collez le JSON retourné par un endpoint REST tiers et obtenez des classes Python typées prêtes à l'emploi avec requests ou httpx.
Modèles de requêtes/réponses FastAPI
Partez de la forme d'un payload JSON et générez des définitions de dataclasses. Convertissez-les en modèles Pydantic pour obtenir une validation automatique dans les gestionnaires de routes FastAPI.
Schémas de pipelines de données
Définissez des structures d'enregistrements typés pour les pipelines ETL. Collez un exemple de message JSON provenant de Kafka, RabbitMQ ou SQS et générez des dataclasses qui documentent la forme attendue.
Analyse de fichiers de configuration
Transformez des fichiers de configuration JSON en classes Python typées. Chargez votre config avec json.load(), puis construisez une instance de dataclass pour bénéficier de l'autocomplétion et de la vérification de types dans votre éditeur.
Génération de fixtures de tests
Créez des fixtures typées depuis des exemples de données JSON. Les ingénieurs QA peuvent coller des instantanés de réponses d'API et produire des définitions de dataclasses pour les suites de tests pytest.
Apprentissage des annotations de types Python
Les étudiants peuvent coller n'importe quelle structure JSON et voir comment Python la représente avec des annotations de types. Le code généré illustre List, Optional, les classes imbriquées et les valeurs par défaut en contexte.

Correspondance des types JSON vers Python

Chaque valeur JSON correspond à une annotation de type Python spécifique. Le tableau ci-dessous montre comment le convertisseur traduit chaque type JSON, avec la syntaxe du module typing (Python 3.7+) et la syntaxe native disponible à partir de Python 3.10.

Type JSONExemplePython (typing)Python 3.10+
string"hello"strstr
number (integer)42intint
number (float)3.14floatfloat
booleantrueboolbool
nullnullOptional[str]str | None
object{"k": "v"}@dataclass classnested model
array of strings["a", "b"]List[str]list[str]
array of objects[{"id": 1}]List[Item]list[Item]
mixed array[1, "a"]List[Any]list[Any]

Référence du décorateur dataclass

Le décorateur @dataclass accepte plusieurs paramètres qui modifient le comportement de la classe générée. Cette référence couvre les options les plus utiles lorsqu'on travaille avec des données issues de JSON.

Décorateur / ChampComportementÀ utiliser quand
@dataclassGenerates __init__, __repr__, __eq__ from field annotationsStandard dataclasses
@dataclass(frozen=True)Makes instances immutable (hashable, no attribute reassignment)Config objects, dict keys
@dataclass(slots=True)Uses __slots__ for lower memory and faster attribute accessPython 3.10+, large datasets
@dataclass(kw_only=True)All fields require keyword arguments in __init__Python 3.10+, many fields
field(default_factory=list)Sets a mutable default without sharing state between instancesList/dict/set defaults

dataclass vs Pydantic vs TypedDict

Python propose trois façons courantes de définir des structures typées depuis du JSON. Chacune convient à un cas d'usage différent. Les dataclasses sont l'option de la bibliothèque standard, sans dépendance. Pydantic ajoute une validation à l'exécution. TypedDict annote des dicts classiques sans créer de nouvelle classe.

@dataclass
Bibliothèque standard (Python 3.7+). Génère __init__, __repr__ et __eq__. Pas de validation à l'exécution. Compatible avec mypy et dataclasses-json pour la sérialisation. Idéal pour les structures de données internes où vous contrôlez l'entrée.
BaseModel (Pydantic)
Bibliothèque tierce. Valide les types et contraintes à l'exécution. Analyse le JSON directement via model_validate_json(). Choix standard pour FastAPI, la gestion des paramètres et tout code recevant des données non fiables.
TypedDict
Bibliothèque standard (Python 3.8+). Ajoute des annotations de types aux dicts classiques. Aucune méthode __init__ ni méthode générée. Les valeurs restent accessibles via l'interface dict. À utiliser quand vous avez besoin de la vérification de types tout en conservant l'interface dict, par exemple dans des bases de code existantes.

Exemples de code

Ces exemples montrent comment utiliser les dataclasses générées en Python, comment les produire programmatiquement depuis JavaScript, et comment utiliser des approches alternatives comme Pydantic et les outils en ligne de commande.

Python (dataclasses)
from dataclasses import dataclass
from typing import List, Optional
import json

@dataclass
class Address:
    street: str
    city: str
    zip: str

@dataclass
class User:
    id: int
    name: str
    email: str
    active: bool
    score: float
    address: Address
    tags: List[str]
    metadata: Optional[str] = None

raw = '{"id":1,"name":"Alice","email":"alice@example.com","active":true,"score":98.5,"address":{"street":"123 Main St","city":"Springfield","zip":"12345"},"tags":["admin","user"],"metadata":null}'
data = json.loads(raw)

# Reconstruct nested objects manually
addr = Address(**data["address"])
user = User(**{**data, "address": addr})
print(user.name)     # -> Alice
print(user.address)  # -> Address(street='123 Main St', city='Springfield', zip='12345')
JavaScript (generate Python from JSON)
// Minimal JSON-to-Python-dataclass generator in JS
function jsonToPython(obj, name = "Root") {
  const classes = [];
  function infer(val, fieldName) {
    if (val === null) return "Optional[str]";
    if (typeof val === "string") return "str";
    if (typeof val === "number") return Number.isInteger(val) ? "int" : "float";
    if (typeof val === "boolean") return "bool";
    if (Array.isArray(val)) {
      const first = val.find(v => v !== null);
      return first ? `List[${infer(first, fieldName + "Item")}]` : "List[Any]";
    }
    if (typeof val === "object") {
      const clsName = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
      build(val, clsName);
      return clsName;
    }
    return "Any";
  }
  function build(obj, cls) {
    const fields = Object.entries(obj).map(([k, v]) => `    ${k}: ${infer(v, k)}`);
    classes.push(`@dataclass\nclass ${cls}:\n${fields.join("\n")}`);
  }
  build(obj, name);
  return classes.join("\n\n");
}

const data = { id: 1, name: "Alice", scores: [98, 85] };
console.log(jsonToPython(data, "User"));
// @dataclass
// class User:
//     id: int
//     name: str
//     scores: List[int]
Python (Pydantic BaseModel alternative)
from pydantic import BaseModel
from typing import List, Optional

class Address(BaseModel):
    street: str
    city: str
    zip: str

class User(BaseModel):
    id: int
    name: str
    email: str
    active: bool
    score: float
    address: Address
    tags: List[str]
    metadata: Optional[str] = None

# Pydantic parses and validates JSON in one step
raw = '{"id":1,"name":"Alice","email":"alice@example.com","active":true,"score":98.5,"address":{"street":"123 Main St","city":"Springfield","zip":"12345"},"tags":["admin","user"],"metadata":null}'
user = User.model_validate_json(raw)
print(user.name)              # -> Alice
print(user.model_dump_json()) # -> re-serializes to JSON
CLI (datamodel-code-generator)
# Install the generator
pip install datamodel-code-generator

# Generate dataclasses from a JSON file
datamodel-codegen --input data.json --output models.py --output-model-type dataclasses.dataclass

# Generate Pydantic models instead
datamodel-codegen --input data.json --output models.py

# From a JSON string via stdin
echo '{"id": 1, "name": "Alice", "tags": ["admin"]}' | \
  datamodel-codegen --output-model-type dataclasses.dataclass
# Output:
# @dataclass
# class Model:
#     id: int
#     name: str
#     tags: List[str]

Questions fréquentes

Quelle est la différence entre une dataclass Python et une classe ordinaire ?
Une dataclass utilise le décorateur @dataclass pour générer automatiquement les méthodes __init__, __repr__ et __eq__ à partir des annotations de champs. Une classe ordinaire vous oblige à écrire ces méthodes vous-même. Les dataclasses réduisent le code répétitif lorsque la classe sert principalement à contenir des données, ce qui est le cas typique des structures issues de JSON.
Puis-je utiliser les dataclasses avec la sérialisation JSON directement ?
Le module json de la bibliothèque standard ne peut pas sérialiser les instances de dataclasses par défaut. Utilisez dataclasses.asdict() pour convertir une dataclass en dict, puis passez ce dict à json.dumps(). Pour plus de contrôle, la bibliothèque dataclasses-json ajoute les méthodes .to_json() et .from_json(), et les modèles Pydantic gèrent la sérialisation nativement.
Comment le convertisseur gère-t-il les objets JSON imbriqués ?
Chaque objet imbriqué devient une définition @dataclass séparée. Si un champ JSON nommé "address" contient un objet avec "street" et "city", le convertisseur crée une dataclass Address et annote le champ parent comme address: Address. Les structures profondément imbriquées produisent plusieurs définitions de dataclasses dans l'ordre des dépendances.
Que se passe-t-il lorsqu'un champ JSON est null ?
Les champs null sont annotés comme Optional[str] (ou le type approprié s'il peut être déduit du contexte) avec une valeur par défaut None. Les champs avec des valeurs par défaut doivent apparaître après les champs obligatoires dans une dataclass, donc le convertisseur place les champs optionnels en fin de définition de classe.
Quelle est la différence entre les dataclasses et les modèles Pydantic pour le JSON ?
Les dataclasses font partie de la bibliothèque standard et ne valident pas les données à l'exécution. Les modèles Pydantic valident les types, appliquent des contraintes et peuvent analyser des chaînes JSON brutes directement. Si vous recevez du JSON de sources externes et devez rejeter les données malformées, Pydantic est plus adapté. Pour les échanges de données internes où vous faites confiance à l'entrée, les dataclasses sont plus légères et n'ont aucune dépendance externe.
Comment gérer les clés JSON camelCase dans les dataclasses Python ?
La convention Python utilise le snake_case pour les noms de variables. Le convertisseur traduit les clés camelCase comme "firstName" en champs snake_case comme first_name. Si vous devez désérialiser depuis du JSON, utilisez la bibliothèque dataclasses-json avec une configuration qui fait correspondre les deux conventions de nommage, ou écrivez une méthode __post_init__ personnalisée.
Ce convertisseur prend-il en charge la syntaxe Python 3.10+ comme list[str] au lieu de List[str] ?
Le convertisseur génère des imports du module typing (List, Optional) pour une compatibilité maximale avec Python 3.7 à 3.12. Si votre projet cible Python 3.10 ou ultérieur, vous pouvez remplacer List[str] par list[str] et Optional[str] par str | None sans risque. Le tableau de correspondance des types ci-dessus présente les deux formes.