logo
GeekFormat

JSON vers Python

Outil en ligne gratuit JSON vers Python qui convertit automatiquement les données JSON en classes @dataclass Python avec annotations de type. Les chaînes deviennent str, les entiers int, les flottants float, les booléens bool, les tableaux List[T], les objets imbriqués génèrent des dataclass indépendantes, null devient Optional[Any]. Exécution locale dans le navigateur, copie en un clic ou téléchargement de model.py. Le code généré est compatible avec la bibliothèque standard dataclasses de Python 3.7+, utilisable directement avec FastAPI, Django REST framework, marshmallow, cattrs et autres frameworks Python majeurs, ou comme structure de données fortement typée dans Jupyter Notebook.

Recommandations connexes

À propos de JSON vers Python : transformer les données JSON en modèles dataclass exécutables

JSON vers Python est le processus de conversion de données au format JSON (objets ou tableaux) en définitions de type dataclass Python. Python est l'un des langages de programmation généralistes les plus populaires aujourd'hui, largement utilisé pour le backend Web (FastAPI / Django / Flask), la science des données (pandas / scikit-learn), le scraping, les scripts d'administration, l'apprentissage automatique, les tests automatisés et autres scénarios. En développement, il est fréquent de devoir convertir des échantillons JSON de la documentation d'API ou de réponses réelles en types Python ; écrire des classes manuellement est non seulement répétitif mais aussi sujet aux erreurs de type de champs, l'objectif de cet outil est d'automatiser ce processus.

dataclass est une fonctionnalité de la bibliothèque standard introduite dans Python 3.7 (PEP 557), qui génère automatiquement des méthodes magiques comme __init__, __repr__, __eq__ via le décorateur @dataclass, réduisant la définition de classes de données d'une dizaine de lignes de code boilerplate à quelques lignes de déclaration de champs. Cet outil est basé sur quicktype-core exécuté localement dans le navigateur, utilise les options de rendu just-types et no-comments pour générer du code dataclass Python pur. La sortie inclut les importations nécessaires comme from dataclasses import dataclass et from typing import Any, List, Optional, utilisable directement dans des projets Python 3.7+.

L'inférence de type est au cœur de JSON vers Python. L'outil mappe les types de base JSON vers les types standard Python : les chaînes deviennent str, les entiers int, les flottants float, les booléens bool, les tableaux List[T] (éléments inférés depuis le premier élément), les objets imbriqués des @dataclass indépendantes, les valeurs null Optional[Any]. Pour les objets imbriqués, l'outil crée automatiquement une nouvelle dataclass pour chaque niveau, nommée selon la capitalisation du nom de champ, par exemple le champ address générera une classe Address, les objets dans le tableau items généreront une classe Item.

Contrairement à certains outils en ligne qui nécessitent d'envoyer le JSON à un serveur pour traitement, tous les calculs de cet outil s'effectuent dans le navigateur. quicktype-core est chargé et exécuté via Web Worker, l'analyse JSON, l'inférence de type, la génération de code Python et le téléchargement de fichiers se font tous localement, aucune donnée n'est envoyée à un serveur. C'est particulièrement important pour les JSON contenant des clés API, champs de confidentialité utilisateur ou structures métier non lancées, les données sont effacées de la mémoire à la fermeture de la page.

Le code généré peut être directement placé et utilisé dans un projet Python. dataclass fait partie de la bibliothèque standard sans installation supplémentaire ; le module typing est disponible depuis Python 3.5. Si vous utilisez Python 3.9+, vous pouvez remplacer manuellement List[str] par le list[str] natif, Optional[str] par str | None, pour profiter d'une syntaxe d'annotations de type plus moderne. Si le projet utilise Pydantic pour la validation de données (comme FastAPI), remplacez simplement @dataclass par class Xxx(BaseModel): pour basculer sans transition vers un modèle Pydantic.

Il est important de noter que le code généré automatiquement est un point de départ et non une fin. L'outil infère les types à partir d'échantillons JSON, il ne peut pas déterminer les types précis au niveau métier (par exemple les types sémantiques comme URL, Email, ID sont tous uniformément inférés comme str). Pour les champs JSON en snake_case, les champs dataclass Python sont générés tels quels, vous devrez peut-être modifier manuellement les noms de champs en snake_case ou configurer le mappage via l'alias_generator de Pydantic. Il est recommandé d'utiliser le résultat généré comme première version, puis d'affiner les noms de champs, types, valeurs par défaut et logique de validation selon les normes du projet.

Un autre axe de comparaison important est dataclass vs Pydantic BaseModel vs attrs vs TypedDict. dataclass est la bibliothèque standard Python, sans dépendance, modélisation de données pure, sans validation à l'exécution, adaptée aux objets de transfert de données internes (DTO) et aux modèles ORM. Pydantic BaseModel ajoute sur la base de dataclass une validation pilotée par le type, la sérialisation et la gestion des paramètres, c'est la couche de modèle de données par défaut de FastAPI. attrs est le prédécesseur de dataclass, offrant plus d'options de configuration (slots, validators, converters). TypedDict est une solution légère du module typing, fournit uniquement des indications de type sans contrainte d'exécution, adaptée aux scénarios compatibles avec dict. Cet outil génère dataclass par défaut, remplaçable en un clic dans l'éditeur par l'une des formes ci-dessus.

Comparé aux outils en ligne comme Java vers JSON / TypeScript vers JSON, JSON vers Python a une valeur unique dans l'écosystème de la science des données. Les fonctions pandas comme read_json, DataFrame.from_records, json_normalize nécessitent souvent des listes d'objets de type dictionnaire ; Pipeline.fit de scikit-learn accepte des structures de données avec contraintes de champs ; dans Jupyter Notebook, encapsuler les réponses JSON avec dataclass lors de l'analyse exploratoire améliore significativement la lisibilité du code. Le code généré par cet outil s'intègre parfaitement à ces écosystèmes, faisant de l'échantillon JSON la source unique de vérité.

L'écosystème Python propose d'autres outils optionnels pour la conversion bidirectionnelle JSON ↔ dataclass : marshmallow (axé sur la validation de sérialisation/désérialisation), cattrs (bibliothèque de conversion structurée), pydantic (validation à l'exécution + aide IDE), apischema (génère JSON Schema sans décorateur dataclass). La dataclass pure générée par cet outil est une entrée naturelle pour ces bibliothèques : après avoir copié la classe générée, les utilisateurs de marshmallow ajoutent simplement Schema(Model), les utilisateurs de cattrs utilisent cattrs.structure(data, Model) pour effectuer la conversion. Il est recommandé d'utiliser cet outil comme point de départ pour la génération de types, puis de superposer les bibliothèques écologiques appropriées selon l'architecture du projet.

Dans les scénarios CLI et d'automatisation, JSON vers Python a également une valeur unique. Après analyse des arguments de ligne de commande par argparse, il est généralement nécessaire de les encapsuler secondairement en dict puis de les transmettre aux fonctions métier ; remplacer dict par la dataclass générée rend les scripts plus robustes. De même, après encapsulation par dataclass, les fichiers de configuration (config.json / settings.json) permettent aux collègues opérationnels de voir directement la signification et le type des champs dans l'IDE, et avec mypy de détecter précocement les erreurs de configuration lors de la phase CI.

Un dernier détail souvent négligé est l'équilibre entre performance et maintenabilité. La dataclass générée par cet outil est le support idéal pour les instantanés immuables : avec (frozen=True), les instances ne peuvent pas être modifiées, partage sécurisé entre threads ; avec (slots=True) (Python 3.10+), l'occupation mémoire est réduite d'environ 40 %. Pour les champs List[str] générés, pour éviter le piège du partage de la même liste vide, il faut utiliser field(default_factory=list) au lieu de = [], le code généré par cet outil respecte déjà cette bonne pratique.

Cas d'utilisation

  • Intégration REST API : convertissez la réponse JSON renvoyée par le backend en @dataclass Python, utilisez avec requests + json pour une analyse de requêtes HTTP fortement typée. Avec mypy ou pyright, obtenez la complétion d'attributs et la vérification de type en temps réel dans l'IDE, évitez les fautes de frappe courantes.
  • Modèles de requête/réponse FastAPI : convertissez les exemples JSON de la documentation d'API en modèles Pydantic BaseModel, unifiez les définitions de modèles frontend/backend. Il est recommandé d'activer le paramètre response_model dans les projets FastAPI pour que la documentation OpenAPI génère automatiquement des exemples de champs et des règles de validation.
  • Sérialiseurs Django Ninja / DRF : convertissez la réponse JSON en dataclass puis ajoutez manuellement ModelSerializer de DRF ou des classes dérivées Schema de Ninja. ModelSerializer de DRF peut générer automatiquement des règles de validation basées sur dataclass, Schema de Ninja peut également réutiliser directement la sortie de cet outil.
  • Modélisation de données de scraping : convertissez les données JSON extraites de pages web en dataclass, évitez les oublis de champs et fautes de frappe dus à l'accès dynamique par dict. Avec des bibliothèques de scraping asynchrones comme requests-html, playwright, dataclass réduit également le code boilerplate de désérialisation JSON.
  • Définition de caractéristiques ML : convertissez le schéma JSON des données d'entraînement scikit-learn / pandas en dataclass, standardisez les noms et types de champs de caractéristiques. sklearn Pipeline.fit(X, y) accepte des structures de données avec annotations de type, dataclass + asdict est un pont efficace pour la conversion avec pandas DataFrame.
  • Désérialisation de fichiers de configuration : convertissez des exemples de fichiers de configuration YAML/JSON en dataclass, utilisez avec Hydra / OmegaConf pour une lecture de configuration fortement typée. Avec le décorateur @dataclass de Hydra, la configuration bénéficie de la complétion automatique dans l'IDE, évitez les fautes de frappe et incohérences de type courantes dans les configurations YAML.
  • Structure temporaire Jupyter Notebook : convertissez les échantillons JSON de l'analyse de données exploratoire en dataclass, facilitez l'accès aux attributs et la complétion IDE dans Notebook. Encapsuler les réponses JSON avec dataclass dans Notebook améliore significativement la lisibilité du code d'analyse exploratoire, facilite la refactorisation ultérieure en modules de production.
  • Définition d'interfaces de microservices : convertissez les exemples JSON de corps de requête de services gRPC/HTTP en types Python, unifiez les définitions de modèles côté serveur. Après conversion du protobuf gRPC en JSON, la conversion en dataclass peut servir de modèle fortement typé pour les services backend, aligné sur les types TypeScript frontend.
  • Développement d'outils CLI : convertissez les exemples JSON de configuration de ligne de commande en dataclass, utilisez avec argparse pour la désérialisation et la validation de configuration. La conversion d'un Namespace argparse en dataclass ne nécessite qu'une ligne dataclass(**vars(args)), plus sûre que l'écriture manuelle de logique d'analyse.
  • Construction de données de test : convertissez les fixtures JSON réelles renvoyées par le backend en types Python, utilisez dataclasses.replace dans pytest pour des tests pilotés par données. Le décorateur parametrize de pytest associé à dataclass permet de construire des fixtures de test typées, avec des messages d'échec plus clairs.
  • Analyse structurée de journaux : convertissez les journaux JSON collectés par ELK / Loki en dataclass, facilitez le filtrage et les règles d'alerte. Encapsulés par dataclass, les journaux JSON d'ELK permettent un filtrage précis par champ et des requêtes d'agrégation, plus sûrs que l'accès par dict.
  • Migration de centre de configuration : convertissez les configurations JSON d'Apollo / Nacos / Consul en types Python, pour le rechargement à chaud des configurations côté serveur. Les configurations JSON d'Apollo / Nacos peuvent être validées bidirectionnellement avec dataclass, les champs manquants ou incohérences de type sont détectés immédiatement lors de changements de configuration.
  • Collaboration inter-langages : lors de l'intégration entre backend Python et frontend TypeScript, convertissez le même JSON en dataclass Python et interface TS pour maintenir la cohérence des deux côtés. Dans les scénarios de collaboration inter-langages, le backend Python et le frontend TS partagent le même échantillon JSON, génèrent respectivement dataclass et interface pour maintenir la cohérence des noms de champs.
  • Migration de base de données : convertissez les documents JSON exportés depuis des champs MongoDB / PostgreSQL JSONB en modèles Python, comme référence pour la définition d'entités ORM. Les documents JSONB MongoDB exportés puis convertis en dataclass servent de référence de champs pour les entités ORM, plus faciles à maintenir que la lecture directe de documents MongoDB.
  • Blockchain/Web3 : convertissez les réponses JSON RPC on-chain en dataclass Python, pour l'encapsulation de types de SDK comme web3.py. Les SDK Ethereum comme web3.py, eth-brownie prennent tous en charge les valeurs de retour de style dataclass, facilitant l'encapsulation secondaire.
  • ETL de science des données : convertissez les sources de données JSON en amont en dataclass puis utilisez pandas DataFrame.from_records pour convertir en tableaux en vue d'analyses en aval. pandas DataFrame.from_records([asdict(d) for d in dataclass_list]) effectue en une ligne la conversion de structures imbriquées en tableaux.
  • Validation de schéma OpenAPI : convertissez les exemples JSON des documents OpenAPI en modèles Python, puis écrivez la logique de validation pydantic. Le champ example d'OpenAPI peut être directement copié comme entrée de cet outil, le modèle Pydantic généré valide automatiquement la cohérence de la documentation API.
  • Exemples pédagogiques : dans les cours Python, convertissez des exemples JSON en dataclass pour enseigner le module typing, les annotations de type, la génération automatique de __init__ et d'autres concepts. dataclass est le support de démonstration le plus direct pour enseigner le module typing, la génération automatique de __init__, slots et autres concepts dans les cours Python.
  • Conversion de noms de champs : après conversion de réponses API JSON en snake_case en dataclass, modifiez manuellement les noms de champs, ou utilisez l'alias_generator de Pydantic pour le mappage de champs. L'alias_generator de Pydantic peut être configuré dans BaseModel pour un mappage automatique camelCase ↔ snake_case, évitant l'écriture manuelle d'alias.

Comment utiliser

  1. Collez le contenu JSON dans l'éditeur de gauche, ou cliquez sur le bouton de téléchargement pour sélectionner un fichier .json / .txt
  2. Attendez 400 ms pour la conversion automatique, le code Python dataclass généré s'affichera à droite
  3. Si le format JSON est incorrect, cliquez sur le bouton « Réparer JSON » pour corriger automatiquement les problèmes de syntaxe courants
  4. Cliquez sur « Copier » pour coller dans le répertoire models/ du projet, ou cliquez sur « Télécharger » pour sauvegarder en tant que fichier model.py

Fonctionnalités

  • Conversion locale dans le navigateur : l'analyse JSON et la génération de code Python s'effectuent entièrement dans le navigateur, aucune donnée n'est envoyée à un serveur, utilisable en toute confiance pour des réponses API sensibles
  • Sortie avec annotations dataclass : génère des classes Python standard décorées par @dataclass, utilisables directement dans des projets Python 3.7+ avec from __future__ import annotations
  • Inférence de type automatique : str / int / float / bool / List[T] / Dict[str, Any] / Optional[Any] sont mappés automatiquement selon les valeurs JSON, pas besoin de spécifier manuellement les types des champs
  • Séparation automatique des objets imbriqués : les objets JSON imbriqués génèrent des classes @dataclass indépendantes, nommées selon la capitalisation du nom de champ (ex. address -> Address), évite les définitions de types dupliquées
  • Développement automatique des génériques List : les tableaux JSON sont automatiquement convertis en List[T], le type des éléments est inféré depuis le premier élément non null du tableau, par exemple ["a","b"] -> List[str], [{...},{...}] -> List[Item]
  • Champs optionnels Optional : les champs null génèrent Optional[Any] comme solution de repli, garantissant que les annotations de type expriment correctement les cas où un champ peut manquer
  • Conversion automatique avec anti-rebond de 400 ms : la conversion se déclenche automatiquement après collage, aperçu du code Python en temps réel à droite, réduit l'attente et les clics inutiles
  • Réparation d'erreurs JSON en un clic : corrige automatiquement les erreurs courantes comme les virgules traînantes, guillemets simples, guillemets manquants, continue la génération de code après réparation réussie
  • Copie et téléchargement : copiez tout le code Python en un clic, ou téléchargez-le en tant que fichier model.py à placer directement dans la racine du projet ou le sous-module models
  • Historique des entrées localStorage : sauvegarde automatiquement les dernières entrées localement, permet une reprise rapide après actualisation ou fermeture accidentelle
  • Édition à colonnes réactif : saisissez JSON à gauche, consultez le code Python à droite, prend en charge le redimensionnement des panneaux par glisser-déposer, adapté aux grands écrans et mobiles
  • Prise en charge des adaptations secondaires Pydantic / attrs / TypedDict : la dataclass générée peut être adaptée en un clic avec BaseModel ou les décorateurs attrs pour FastAPI, Django Ninja, pydantic-settings et autres frameworks

Exemples de code

Python : analyser une réponse API vers la dataclass générée avec requests

python
# requirements.txt
# requests>=2.31

from dataclasses import dataclass
from typing import Any, List, Optional
import json
import requests


@dataclass
class Address:
    city: str
    zip: str


@dataclass
class User:
    id: int
    name: str
    active: bool
    address: Address
    tags: List[str]
    label: Optional[Any] = None


def main() -> None:
    resp = requests.get("https://api.example.com/users/1", timeout=10)
    resp.raise_for_status()

    # Désérialiser directement la chaîne JSON en instance dataclass
    user: User = User(**resp.json())

    # Accès fortement typé : complétion IDE, vérification statique mypy/pyright
    print(f"{user.name} lives in {user.address.city}")
    print(f"tags: {user.tags}")


if __name__ == "__main__":
    main()

Python : FastAPI utilise le modèle généré pour la validation du corps de requête (version adaptée Pydantic)

python
# pip install fastapi 'pydantic>=2'

from typing import List, Optional
from fastapi import FastAPI
from pydantic import BaseModel


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


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


app = FastAPI()


@app.post("/users")
async def create_user(user: User) -> dict:
    # FastAPI valide automatiquement le corps de requête avec User, erreurs de type/champ obligatoire renvoient 422
    return {"id": user.id, "name": user.name}


@app.get("/users/{user_id}", response_model=User)
async def get_user(user_id: int) -> User:
    # response_model sérialise automatiquement la réponse, documentation OpenAPI générée automatiquement
    return User(
        id=user_id,
        name="Alice",
        email="alice@example.com",
        active=True,
        address=Address(city="Beijing", zip="100000"),
        tags=["fastapi", "pydantic"],
    )

Python : modélisation de données de scraping (dataclass + désérialisation JSON)

python
from dataclasses import dataclass, asdict
from typing import List, Optional
import json


@dataclass
class Author:
    id: int
    name: str


@dataclass
class Article:
    id: int
    title: str
    url: str
    author: Author
    score: int
    tags: List[str]
    summary: Optional[str] = None


def parse_articles(raw_json: str) -> List[Article]:
    """Désérialiser la chaîne JSON extraite par le scraping en liste d'Article."""
    payloads = json.loads(raw_json)
    return [Article(**payload) for payload in payloads]


if __name__ == "__main__":
    raw = '''[
        {
            "id": 1,
            "title": "Hello dataclass",
            "url": "https://example.com/p/1",
            "author": {"id": 10, "name": "Alice"},
            "score": 95,
            "tags": ["python", "typing"],
            "summary": "quick intro"
        }
    ]'''

    articles = parse_articles(raw)
    for art in articles:
        # Complétion automatique IDE pour author.name, tags, summary
        print(f"[{art.score}] {art.title} - {art.author.name}")
        print(f"  tags: {art.tags}")

        # Pour une forme dict (comme écriture MongoDB), utilisez asdict
        doc = asdict(art)
        print(f"  mongo doc: {doc}")

Python : définition de caractéristiques ML (intégration pandas + sklearn)

python
# pip install pandas scikit-learn

from dataclasses import dataclass, field, asdict
from typing import List, Optional
import json
import pandas as pd
from sklearn.ensemble import RandomForestClassifier


@dataclass
class FeatureSchema:
    """Schéma de caractéristiques d'échantillon, généré par l'outil JSON vers Python puis affiné."""
    user_id: int
    age: int
    city: str
    plan: str
    monthly_spend: float
    active: bool
    tags: List[str] = field(default_factory=list)
    last_login: Optional[str] = None


def features_to_frame(samples: List[dict]) -> pd.DataFrame:
    """Convertir la liste JSON en DataFrame, utiliser automatiquement les noms de champs dataclass comme noms de colonnes."""
    rows = [asdict(FeatureSchema(**row)) for row in samples]
    df = pd.DataFrame(rows)
    # Encodage one-hot des champs catégoriels
    df = pd.get_dummies(df, columns=["city", "plan"], drop_first=True)
    return df


def main() -> None:
    raw = json.loads('''[
        {"user_id": 1, "age": 25, "city": "Beijing", "plan": "pro", "monthly_spend": 99.0, "active": true, "tags": ["new"]},
        {"user_id": 2, "age": 40, "city": "Shanghai", "plan": "free", "monthly_spend": 0.0, "active": false, "tags": []}
    ]''')

    X = features_to_frame(raw)
    y = [1, 0]  # Étiquettes supposées : utilisateurs payants / utilisateurs gratuits

    model = RandomForestClassifier(n_estimators=100, random_state=42)
    model.fit(X, y)

    print("feature_columns:", list(X.columns))
    print("importances:", dict(zip(X.columns, model.feature_importances_)))

Best Practices

L'échantillon JSON doit inclure si possible des valeurs d'exemple complètes pour tous les champs

L'outil infère les types à partir de l'échantillon JSON, si un champ est systématiquement null dans l'échantillon, il est remplacé par Optional[Any] comme solution de repli. Il est recommandé de fournir une valeur d'exemple à tous les champs clés avant génération (par exemple "description": "sample" est inféré comme str, "count": 0 comme int), puis de supprimer les valeurs d'exemple après génération pour obtenir des types précis.

Les JSON complexes doivent être de préférence divisés en plusieurs dataclass

Cet outil développe par défaut récursivement les objets imbriqués en classes indépendantes, mais quand le nombre de champs d'un seul fichier dépasse 50, il est recommandé de diviser manuellement en sous-modèles comme models/user.py, models/order.py. Cela présente trois avantages : ① compilation plus rapide ; ② répartition des tâches plus claire entre les membres de l'équipe ; ③ les références circulaires sont plus faciles à gérer.

Basculez vers Pydantic BaseModel quand une validation à l'exécution est nécessaire

Si le projet utilise FastAPI ou nécessite une validation stricte du corps de requête, il est recommandé d'adapter immédiatement en BaseModel après génération de la dataclass : remplacez @dataclass par class Xxx(BaseModel):, remplacez from dataclasses import dataclass par from pydantic import BaseModel, les autres types de champs restent inchangés. Après réécriture de son noyau en Rust, Pydantic v2 est même plus rapide que la validation dataclass.

Associez mypy pour la vérification de type en phase CI

Ajoutez la commande mypy src/ --strict dans le pipeline CI, elle permet de détecter les fautes de frappe sur les champs, incohérences de type, utilisations abusives d'Optional et autres problèmes. La dataclass générée par cet outil est entièrement conforme à la norme PEP 484, et passe mypy sans avertissement. Associé à un hook pre-commit, les développeurs bénéficient d'une vérification automatique avant soumission.

Évitez les valeurs par défaut mutables dans les champs dataclass

tags: List[str] = [] est une erreur courante, qui fait que toutes les instances partagent la même liste vide. Le code généré par cet outil utilise déjà field(default_factory=list) pour gérer cela, mais lors de l'ajout manuel de nouveaux champs après génération, assurez-vous de respecter cette règle. Le système de types Python ne révèle ce bug qu'à l'exécution, les vérificateurs statiques ne le détectent pas forcément.

Le model.py téléchargé doit être placé dans un paquet models indépendant

Structure de répertoires recommandée : src/models/__init__.py + src/models/user.py + src/models/order.py. Avantages : ① le code métier simplifie les imports avec from models import User ; ② l'équipe peut s'approprier différentes dataclass par module ; ③ les fixtures pytest peuvent être importées de manière unifiée dans conftest.py.

Les JSON sensibles doivent être traités localement

Si le JSON contient des informations sensibles comme clés API, tokens, structures métier non publiques, spécifications de produits non lancées, veillez à utiliser cet outil (exécution locale dans le navigateur) plutôt que des outils en ligne nécessitant un téléchargement. Cet outil n'envoie aucune donnée à un serveur, tout le contenu JSON en mémoire est effacé à la fermeture de la page.

Activez slots en Python 3.10+ pour économiser la mémoire

Si vous devez instancier de nombreuses dataclass (comme pour la modélisation de millions de données en scraping), il est recommandé d'activer @dataclass(slots=True) en Python 3.10+. Une fois activé, les instances n'utilisent plus __dict__, l'occupation mémoire est réduite de 30-40%, la vitesse d'accès aux attributs améliorée d'environ 20%. Le code généré par cet outil n'active pas cette option par défaut, vous pouvez ajouter manuellement slots=True après génération.

FAQ

Comment convertir JSON en dataclass Python ?

Collez le contenu JSON dans l'éditeur de gauche, ou cliquez sur le bouton de téléchargement pour sélectionner un fichier .json / .txt. L'outil appellera automatiquement quicktype-core dans les 400 ms pour générer du code Python, la définition de classe avec décorateur @dataclass s'affichera à droite. Si le format JSON est incorrect, cliquez sur le bouton « Réparer JSON » pour corriger automatiquement avant conversion. Si la conversion ne se déclenche pas dans les 400 ms, cliquez manuellement sur le bouton Convert de la barre d'outils.

Le code Python généré inclut-il les annotations dataclass ?

Oui. L'outil utilise le mode de rendu just-types de quicktype-core, générant pour Python le décorateur @dataclass, from dataclasses import dataclass et les importations nécessaires comme from typing import Any, List, Optional, utilisable directement avec la bibliothèque standard dataclasses de Python 3.7+. Si vous n'avez pas besoin de dataclass, vous pouvez supprimer manuellement le décorateur et les instructions d'importation, et réécrire en classe ordinaire. Pour des types plus précis (comme Decimal, UUID, datetime), il est recommandé de l'utiliser avec Pydantic BaseModel.

Quelles structures de données JSON sont prises en charge ?

Prend en charge toutes les structures JSON valides : types de base (null, boolean, number, string), tableaux (unidimensionnels ou multidimensionnels), objets imbriqués (profondeur arbitraire). Les objets JSON génèrent une dataclass racine, les tableaux JSON génèrent un conteneur racine de type List[RootClass]. Ne prend pas en charge les valeurs non JSON comme les littéraux d'objet JavaScript, fonctions, Symbol, undefined. quicktype-core prend également en charge JSON Schema, exemples JSON et entrées TypeScript comme sources de types.

Comment les types de champs JSON sont-ils mappés vers les types Python ?

Les chaînes deviennent str, les entiers int, les flottants float, les booléens bool, les tableaux List[T] (type d'élément inféré depuis le premier élément), les objets imbriqués des @dataclass indépendantes, null devient Optional[Any]. Consultez le « Tableau de correspondance rapide JSON vers types Python » en bas de page pour les règles de mappage détaillées. Python 3.9+ peut utiliser la syntaxe native list[str], dict[str, Any] sans importer depuis le module typing.

Quel type est généré pour les valeurs null ?

Les valeurs null dans JSON génèrent Optional[Any], indiquant que le champ peut manquer ou avoir un type indéterminé. Si vous connaissez le type réel du champ, fournissez une valeur d'exemple dans le JSON source (ex. "field": "" est inféré comme str), puis modifiez en Optional[str] ou un type plus précis selon les besoins métier après génération. S'il y a de nombreux champs null dans le JSON, remplacez-les par des valeurs d'exemple (comme chaîne vide, 0, false) dans les données source pour obtenir une inférence plus précise.

Les tableaux sont-ils convertis en List ?

Oui. Les tableaux JSON sont uniformément convertis en le générique Python List[T], le type des éléments est automatiquement inféré depuis le premier élément du tableau. Par exemple ["a","b"] génère List[str], [1,2,3] List[int], [{...},{...}] List[Item]. Un tableau vide [] génère par défaut List[Any]. Les tableaux multidimensionnels sont développés récursivement en List[List[T]], par exemple [[1,2],[3,4]] devient List[List[int]].

Comment les objets imbriqués sont-ils traités ?

Chaque objet imbriqué génère une classe @dataclass indépendante, nommée selon la capitalisation du nom de champ. Par exemple si l'objet racine contient un champ address, deux dataclass Root et Address sont générées simultanément, référencées dans Root via address: Address. Les objets de même structure partagent le même type, évitant les définitions dupliquées. Les objets de même structure sont fusionnés en une seule classe @dataclass pour éviter la redondance ; une séparation manuelle par copie en plusieurs classes est possible après génération si nécessaire.

Peut-on personnaliser le nom de la classe générée ?

quicktype-core utilise par défaut le nom de la source JSON (comme User) comme nom de classe racine. Vous pouvez modifier manuellement le nom de classe et ses références après génération. Le nom de fichier model.py téléchargé peut également être renommé lors de l'enregistrement selon vos besoins. Le nom de classe racine est par défaut JsonRootClass, vous pouvez utiliser la fonction Renommer de l'IDE après génération pour le renommer en lot en un nom sémantique métier (comme User, Order).

Le code généré peut-il être utilisé directement dans un projet ?

Il est utilisable directement, mais assurez-vous d'avoir un environnement Python 3.7+ (dataclasses est une bibliothèque standard depuis 3.7). Le code dépend du module typing, disponible depuis Python 3.5+. Pour utiliser les génériques natifs plus concis list[str], dict[str, Any] en Python 3.9+, remplacez manuellement les types importés comme List[str]. Avec des outils de gestion de paquets modernes comme uv, poetry, pdm, la déclaration des dépendances peut légèrement différer, mais dataclass elle-même ne nécessite aucune dépendance supplémentaire.

Peut-on convertir en Pydantic BaseModel au lieu de dataclass ?

L'outil génère @dataclass par défaut. Si vous avez besoin de Pydantic BaseModel pour la validation des corps de requête FastAPI, vous pouvez : ① remplacer from dataclasses import dataclass par from pydantic import BaseModel ; ② remplacer @dataclass par class Xxx(BaseModel): ; ③ remplacer Optional[Any] par Optional[type spécifique] ou conserver la valeur par défaut. Pydantic v2 prend également en charge l'héritage direct de dataclass. Pydantic v2 prend en charge le style dataclass : vous pouvez directement ajouter le décorateur @dataclass puis le transmettre à FastAPI sans hériter de BaseModel.

Quelle est la procédure complète pour générer un modèle de corps de requête FastAPI ?

FastAPI recommande d'utiliser Pydantic BaseModel. Après avoir généré la dataclass, trois étapes de modification : ① remplacer @dataclass par class Xxx(BaseModel): ; ② supprimer l'import dataclasses, ajouter from pydantic import BaseModel ; ③ dans la route FastAPI, recevez le corps de requête avec user: Xxx = Body(...) pour une validation automatique. Utilisation avancée : dans FastAPI, Annotated[User, Body(...)] permet un contrôle accru du type de média et du comportement de validation du corps de requête.

Les données sont-elles envoyées au serveur ? Est-ce sécurisé pour la confidentialité ?

Exécution entièrement locale dans le navigateur. L'analyse JSON, la génération de code Python et le téléchargement de fichiers s'effectuent tous dans le navigateur via JavaScript, les données JSON saisies et le code Python généré ne sont envoyés à aucun serveur, ni enregistrés ou mis en cache dans le cloud. Les JSON sensibles contenant des clés API, tokens, champs métier non publics peuvent être utilisés en toute confiance, ils sont effacés à la fermeture de la page. Après fermeture ou actualisation, toutes les entrées, sorties et historiques localStorage sont effacés de la mémoire sans aucune trace résiduelle.

Faut-il s'inscrire ou se connecter ?

Non. L'outil est entièrement gratuit, sans inscription, connexion ou autorisation nécessaire. Il est utilisable dès l'ouverture de la page, toutes les fonctionnalités sont disponibles localement dans le navigateur. L'outil est entièrement gratuit, sans publicité, sans autorisation, et n'insère pas de filigrane ni de code de suivi dans les résultats générés.

Que faire en cas d'erreur de format JSON ?

L'outil détecte automatiquement la validité du JSON, affiche un message d'erreur rouge à droite en cas d'erreur, et fournit un bouton « Réparer JSON ». Après clic, il corrige automatiquement les erreurs courantes : virgule de fin superflue, remplacement des guillemets simples par doubles, ajout de guillemets aux clés sans guillemets, suppression des commentaires, etc. La génération de code Python se poursuit après réparation réussie. Le JSON réparé ne modifie pas la sémantique d'origine, seule la mise en forme est corrigée ; si le résultat n'est pas satisfaisant, vous pouvez annuler manuellement et recoller.

La conversion d'un grand JSON va-t-elle ralentir ?

L'outil n'a pas de limite explicite de lignes, mais l'analyse et le rendu de très grands JSON par le navigateur peuvent ralentir. Recommandations : ① divisez le JSON puis convertissez par lots ; ② concentrez-vous sur un seul niveau d'imbrication à la fois ; ③ pour une génération par lot de plus de 100 classes, il est recommandé d'utiliser l'outil en ligne de commande quicktype (pip install quicktype) ou datamodel-code-generator. datamodel-code-generator (pip install datamodel-code-generator) est un autre outil en ligne de commande puissant qui prend en charge la sortie directe de modèles Pydantic.

Dépannage

Message « Veuillez saisir des données JSON » ou partie droite vide

La zone de saisie gauche est vide ou ne contient que des espaces. Assurez-vous d'avoir collé un contenu JSON valide, ou cliquez sur le bouton de téléchargement pour sélectionner un fichier .json / .txt, vous pouvez également cliquer sur le bouton d'exemple pour charger un échantillon intégré.

Message d'échec d'analyse JSON

Causes courantes : virgule superflue en fin, utilisation de guillemets simples au lieu de doubles, clés sans guillemets doubles, présence de commentaires JavaScript. Cliquez sur le bouton « Réparer JSON » pour corriger automatiquement certaines erreurs ; en cas d'échec persistant, vérifiez d'abord avec un outil de formatage JSON.

Les types de champs générés ne sont pas assez précis

L'outil infère les types à partir de l'échantillon JSON, par exemple tous les entiers sont int, toutes les chaînes str. Si vous avez besoin de types plus précis comme Decimal, datetime, UUID, EmailStr, modifiez manuellement les types de champs après génération, et utilisez les contraintes Field en mode Pydantic.

Le champ null a généré Optional[Any] au lieu d'Optional[str]

Parce que le null JSON ne permet pas d'inférer le type concret, l'outil utilise Optional[Any] comme solution de repli sécurisée. Si vous connaissez le type réel du champ, remplacez-le par une valeur d'exemple dans le JSON source (comme "field": "") pour régénérer, puis modifiez manuellement en Optional[str].

Message d'absence du module typing à l'exécution

typing est une bibliothèque standard Python 3.5+, dataclass une bibliothèque standard Python 3.7+. Vérifiez la version Python : python --version. Si la version est trop ancienne, mettez à jour vers Python 3.9+ pour bénéficier d'une meilleure syntaxe de génériques (list[str], dict[str, Any]).

Je veux générer Pydantic BaseModel mais ne veux pas réécrire manuellement

L'outil génère @dataclass par défaut. Si le projet doit utiliser Pydantic, deux solutions : ① après copie du résultat généré, utilisez Rechercher & Remplacer de l'IDE pour remplacer @dataclass par class Xxx(BaseModel):, remplacer from dataclasses import dataclass par from pydantic import BaseModel ; ② utilisez plutôt l'outil en ligne de commande datamodel-code-generator (pip install datamodel-code-generator), qui prend en charge la sortie directe de modèles Pydantic.

Erreur d'import du fichier .py téléchargé dans le projet

Causes possibles : ① version Python inférieure à 3.7 (pas de dataclasses) ; ② le projet a un mode strict mypy mais les champs n'ont pas de déclaration de type ; ③ le nom de classe est en conflit avec d'autres modules du projet. Solution : mettez à jour Python vers 3.9+, assurez-vous que tous les champs ont des annotations de type, renommez les classes en conflit avec import as.

Les champs JSON snake_case ne correspondent pas au style de nommage Python

L'outil génère les champs Python en conservant le nom de champ JSON d'origine. Python recommande le nommage snake_case, naturellement cohérent avec le style des champs JSON ; si vous avez besoin de camelCase (comme pour une interface frontend JavaScript), modifiez manuellement les noms de champs ou configurez le mappage d'alias via l'alias_generator de Pydantic.

Ralentissement de la page lors de la conversion d'un très grand JSON

Il est recommandé de diviser le JSON en plusieurs modules indépendants pour la conversion séparée, ou de n'extraire que la partie à modéliser. Le rendu d'un grand nombre de dataclass par le navigateur consomme beaucoup de mémoire, pour les JSON dépassant 10 Mo il est recommandé d'utiliser l'outil en ligne de commande quicktype (npx quicktype) ou datamodel-code-generator.

Échec de validation des champs du corps de requête dans FastAPI (erreur 422)

FastAPI utilise par défaut Pydantic pour une validation stricte, les champs manquants ou incohérences de type renvoient 422. Solution : ① modifiez le type du champ en Optional[type] = None pour rendre le champ optionnel ; ② utilisez Field(default=..., description=...) pour définir les valeurs par défaut et la documentation ; ③ vérifiez que le Content-Type du corps de requête est bien application/json.

Glossaire

dataclass
Décorateur de bibliothèque standard Python 3.7+ (@dataclass), utilisé pour générer automatiquement des méthodes magiques comme __init__, __repr__, __eq__. Cet outil génère précisément des classes @dataclass, par exemple @dataclass class User: id: int; name: str. Essentiellement, il découple le « stockage des données » de la « manipulation des données », fait que la classe se concentre sur la description des champs de données, les méthodes boilerplate étant générées automatiquement par le décorateur.
module typing
Bibliothèque standard d'annotations de type Python, fournit des types génériques comme List, Dict, Optional, Any, Union. Les List[T], Optional[Any] générés par cet outil proviennent tous du module typing. Python 3.9+ peut utiliser directement les list, dict natifs. Aux côtés de collections.abc, contextlib, c'est le module central de la bibliothèque standard Python pour les contraintes de types statiques ; progressivement devenu la norme pour les grands projets depuis PEP 484.
Optional[T]
Type optionnel du module typing, équivaut à Union[T, None], indique qu'un champ peut être None. Cet outil mappe le null JSON vers Optional[Any], modifiable manuellement en Optional[str] ou d'autres types plus précis. Notez la différence entre Optional[T] et T = None valeur par défaut : le premier est une expression de None au niveau du type, le second un paramètre par défaut au niveau de la valeur.
List[T]
Type liste générique Python. Cet outil mappe automatiquement les tableaux JSON en List[T], par exemple un tableau de chaînes devient List[str], un tableau d'objets List[Item]. Python 3.9+ peut écrire list[T]. L'outil importe par défaut depuis le module typing, équivaut au list[T] natif de Python 3.9+ ; si l'équipe préfère la nouvelle syntaxe, l'import peut être remplacé en un clic.
Any
Type spécial du module typing, indique qu'il accepte n'importe quel type. Cet outil utilise Any comme solution de repli par défaut pour les valeurs null et les tableaux vides, pour éviter les erreurs d'inférence de type. L'utilisation fréquente d'Any fait perdre à mypy / pyright sa capacité de vérification, il est recommandé de remplacer par des types précis une fois le type du champ déterminé, par exemple Optional[str], List[int].
Pydantic BaseModel
Classe de base de modèle de données de la bibliothèque Pydantic, fournit la validation, sérialisation et désérialisation de données à l'exécution. La dataclass générée par cet outil peut être adaptée en un clic en BaseModel pour la validation du corps de requête FastAPI. Pydantic v2 a réécrit la logique de validation centrale en Rust, avec des performances 5 à 50 fois supérieures à v1 ; la dataclass générée par cet outil peut également hériter de BaseModel pour bénéficier de cette accélération.
FastAPI
Framework Web Python moderne, repose sur Pydantic pour la validation automatique du corps de requête. La dataclass générée par cet outil peut servir de modèle de requête/réponse pour les fonctions de route FastAPI. Basé sur Starlette + Pydantic, génère automatiquement la documentation OpenAPI, c'est l'un des frameworks d'API backend Python de référence aujourd'hui.
PEP 557
Proposition d'amélioration Python qui définit la syntaxe et le comportement du décorateur dataclass. Le code généré par cet outil est entièrement conforme à la norme PEP 557. Cette proposition a été initiée en 2017 par Eric V. Smith, s'inspirant des concepts de conception de solutions existantes comme attrs, Haskell record.
Annotation de type (Type Hint)
Indication de type annotée par : Type après les paramètres de fonction et variables Python. Tous les champs dataclass générés par cet outil comportent des annotations de type, utilisables avec mypy / pyright pour la vérification de type statique. Les annotations elles-mêmes n'affectent pas le comportement à l'exécution, elles servent uniquement à l'aide IDE, la vérification statique mypy / pyright, et aux bibliothèques de validation à l'exécution (comme Pydantic).
PEP 484
Proposition de norme d'annotations de type Python, définit le module typing et la syntaxe des génériques. Les List[T], Optional[T] générés par cet outil suivent PEP 484. Cette proposition a été rédigée conjointement par Guido van Rossum, Jukka Lehtosalo, Łukasz Langa et autres, c'est le document fondateur du système d'annotations de type Python.
from __future__ import annotations
Instruction d'évaluation différée des annotations introduite par PEP 563, fait que toutes les annotations sont stockées sous forme de chaînes, évitant les problèmes de référence avant. La dataclass générée par cet outil peut ajouter cette ligne pour rendre l'ordre de référence des annotations de type indifférent. Une fois activée, toutes les annotations sont évaluées paresseusement sous forme de chaînes, évitant les problèmes de référence avant (forward reference) et découplant l'ordre des champs dataclass de l'ordre des références.
model.py
Nom de fichier par défaut téléchargé par cet outil, conforme aux conventions des projets Python. Peut être renommé en user.py, schemas.py et autres noms adaptés à la structure du projet. Cohérent avec le style de nommage models.py de Django et Flask ; dans les projets multi-modèles, peut être divisé en sous-modules comme user.py, order.py dans le paquet models.

Tableau de correspondance rapide JSON vers types Python

L'outil infère automatiquement le type Python correspondant selon le type de valeur JSON :

Exemple de valeur JSONType Python généréExplication
nullOptional[Any]Le type de la valeur null est indéterminé, Optional[Any] comme solution de repli, modifiable manuellement en types précis comme Optional[str]
true / falseboolLes booléens JSON sont directement mappés vers le bool Python
42intLes entiers JSON sont mappés par défaut en int Python (précision arbitraire)
3.14floatLes flottants JSON sont mappés par défaut en float Python (double précision)
"hello"strLes chaînes JSON sont mappées en str Python (chaînes Unicode)
["a","b"]List[str]Les tableaux de chaînes deviennent List[str], Python 3.9+ peut écrire list[str]
[1,2,3]List[int]Les tableaux d'entiers deviennent List[int]
[{...},{...}]List[Item]Les tableaux d'objets génèrent la @dataclass correspondante à partir du premier élément, puis l'enveloppent dans List
[]List[Any]Impossible d'inférer le type des éléments d'un tableau vide, Any comme solution de repli
{...} objet imbriqué@dataclass indépendanteLes objets imbriqués génèrent une classe @dataclass indépendante, nommée selon la capitalisation du nom de champ

Explication de la structure du code Python généré

Le code typique généré par quicktype-core pour Python comprend les parties suivantes :

Partie du codeExempleRôle
from dataclasses import dataclassfrom dataclasses import dataclassImporter le décorateur dataclass (bibliothèque standard Python 3.7+)
from typing import Any, List, Optionalfrom typing import Any, List, OptionalImporter les annotations de type du module typing : Any tout type, List liste générique, Optional type optionnel
@dataclass@dataclass class User:Le décorateur fait que la classe génère automatiquement les méthodes __init__, __repr__, __eq__ et autres
Déclaration de champid: int name: strDéfinition de champ avec annotation de type, devient automatiquement paramètre de __init__
Champ List[T]tags: List[str]Représente un champ tableau JSON, le type des éléments est inféré depuis le premier élément du tableau
Champ Optional[Any]label: Optional[Any] = NoneReprésente un champ pouvant être null, la valeur par défaut None rend l'instanciation plus conviviale
@dataclass imbriquéeaddress: AddressRéférence une autre classe @dataclass dans le même module, forme une structure fortement typée

Comparaison des solutions de modélisation de données Python

L'outil produit @dataclass par défaut, mais l'écosystème Python propose plusieurs solutions de modélisation de données, à choisir selon les besoins du projet :

SolutionMéthode d'importValidation à l'exécutionScénarios typiques
@dataclassfrom dataclasses import dataclassAucune (annotations de type uniquement)DTO internes, modèles ORM, conteneurs de données purs ; premier choix sans dépendance pour Python 3.7+
Pydantic BaseModelfrom pydantic import BaseModelForte (conversion de type automatique + validators personnalisés)Corps de requête/réponse FastAPI, validation de fichiers de configuration, transmission de données inter-processus
attrs @attr.sfrom attrs import frozen, fieldvalidators optionnelsScénarios haute performance nécessitant slots / frozen / convertisseurs personnalisés
TypedDictfrom typing import TypedDictAucune (annotation de type uniquement, reste dict à l'exécution)Indications de type légères nécessitant une compatibilité totale avec dict ; comme vérification statique mypy
dataclasses-jsonfrom dataclasses_json import DataClassJsonMixinPeut être associé à PydanticScénarios de désérialisation avec méthodes .to_json() / .from_json() ajoutées à dataclass
msgpack + dataclassimport msgpackAucune (couche de sérialisation)Scénarios de transmission binaire haute performance (msgpack est 30%-50% plus petit que JSON)

Tableau de correspondance versions Python et fonctionnalités dataclass

Différentes versions Python prennent en charge différemment dataclass, typing et Pydantic, choisissez selon la version :

Version PythonPrise en charge dataclassPrise en charge typingUtilisation recommandée
3.6 et inférieuresAucune (nécessite pip install dataclasses)typing de base disponibleNon recommandé ; mise à jour vers 3.9+ conseillée
3.7 - 3.8Décorateur @dataclassList[T], Optional[T] nécessitent import typingVersion minimale utilisable, rétrocompatible avec les projets majeurs
3.9 - 3.10@dataclass + field + asdict completsPeut utiliser les list[T], dict[str, Any] natifs, PEP 585Recommandé : syntaxe d'annotations moderne + dataclass complète
3.10+@dataclass(slots=True) économise la mémoirePEP 604 : int | None remplace Optional[int]Meilleur : slots + syntaxe union moderne
3.11+Optimisations de performance @dataclass + slots + frozenFonctionnalités avancées comme Self, TypeVarTuple, ConcatenatePremier choix pour les nouveaux projets ; les anciens projets peuvent être mis à jour progressivement
3.12+Syntaxe de paramètres de type PEP 695 (type List[T])Nouvelle syntaxe complète d'annotations de typeDécouverte des fonctionnalités de pointe ; production recommandée en 3.11+

Privacy & Security

Toutes les opérations de cet outil JSON vers Python s'effectuent entièrement localement dans votre navigateur : l'analyse JSON, la génération de code Python et le téléchargement de fichiers sont tous exécutés côté client via JavaScript du navigateur, aucun contenu JSON, fichier téléchargé ou code généré n'est envoyé sur le réseau à un serveur quelconque. Le téléchargement de fichiers utilise l'API native FileReader du navigateur pour lire directement en mémoire, sans passer par aucun service intermédiaire. Pas de suivi par Cookie, aucune saisie utilisateur ou donnée d'utilisation n'est collectée. Après fermeture ou actualisation de la page, tous les contenus d'entrée et de sortie sont automatiquement effacés de la mémoire. Convient au traitement de JSON contenant des clés API, tokens, données métier sensibles.

Authoritative References