JSON en classe Python

Générez des dataclasses Python à partir de JSON

À propos de l’outil JSON en classe Python

L’outil JSON en classe Python génère des classes Python qui décrivent la forme d’un échantillon JSON ou d’un JSON Schema : des définitions de types, pas un dict qui contient vos valeurs. Il exécute quicktype-core dans votre navigateur. Chaque objet imbriqué devient une classe, les noms de champs passent en snake_case (first-name devient first_name), et les types utilisent int, float, str, bool, List et Optional de typing, plus Union quand une valeur a deux types et Any pour un tableau vide. Les champs absents de certains éléments d’un tableau reçoivent Optional[...] = None et sont placés après les champs obligatoires, comme l’exigent les dataclasses. Dans « Modèle », choisissez des dataclasses, des modèles Pydantic (BaseModel, avec Field(alias=...) là où un champ est renommé) ou des TypedDict (le dict que renvoie json.loads, avec les clés JSON telles quelles) ; dans « Version de Python », la syntaxe de 3.6 à 3.10 ou ultérieure. Par défaut, il n’y a aucune fonction from_dict ou to_dict : choisissez « Types et fonctions from_dict / to_dict » dans « Code » pour les obtenir. Le JSON peut être collé ou ouvert depuis un fichier .json ou .txt.

Exemple

Deux personnes ; seule Ada a un conjoint, donc spouse devient Optional.

Entrée JSON

[{"first-name": "Ada", "age": 36, "spouse": {"name": "Bob"}},
 {"first-name": "Lin", "age": 29}]

Sortie Python

from dataclasses import dataclass
from typing import Optional

@dataclass
class Spouse:
    name: str

@dataclass
class RootElement:
    first_name: str
    age: int
    spouse: Optional[Spouse] = None

Comment convertir du JSON en dataclasses Python

  1. 1Collez votre JSON dans « Entrée JSON », ou cliquez sur « Ouvrir un fichier » pour charger un fichier .json ou .txt ; un tableau de plusieurs enregistrements donne de meilleurs types qu’un seul. Pour un JSON Schema, choisissez « JSON Schema » dans « Source ».
  2. 2Indiquez le « Nom de la classe », puis choisissez le « Modèle », la « Version de Python » et le « Code ».
  3. 3Cliquez sur « Convertir » pour voir les dataclasses dans « Sortie Python ».
  4. 4Vérifiez les champs renommés : les clés qui sont des mots-clés Python reçoivent un préfixe, par exemple root_class pour class.
  5. 5Cliquez sur « Copier », ou sur « Télécharger » pour obtenir un fichier « model.py ».

Formats et limites

Entrée
Objet JSON, tableau d’objets ou JSON Schema, collé ou ouvert depuis un fichier .json ou .txt ; un tableau de valeurs simples comme [1, 2] n’a aucune classe à générer
Sortie
Dataclasses Python, modèles Pydantic ou TypedDict, avec des annotations typing, enregistrés sous model.py ; des fonctions from_dict / to_dict si vous les choisissez
Noms
Champs en snake_case ; un tableau de premier niveau donne une classe nommée RootElement
Version de Python
3.7 ou ultérieure (module dataclasses) par défaut ; 3.6 donne des classes simples avec __init__, 3.9 list[int], 3.10 int | None ; TypedDict demande 3.8 ou ultérieure
Dates
str par défaut ; datetime quand « Dates en datetime » est coché et qu’une valeur est une date-heure ISO 8601 comme 2024-05-01T10:00:00Z, ainsi que pour "format": "date-time" dans un JSON Schema ; les fonctions from_dict la lisent alors avec python-dateutil ; un TypedDict garde str

Où votre JSON est traité

Les dataclasses sont produites localement, dans votre navigateur, par le moteur quicktype qui se charge à votre première conversion ; votre JSON ne nous est pas transmis. Si l’outil affiche une erreur, le texte du message est envoyé à notre journal des erreurs avec le nom de l’outil ainsi que votre navigateur et sa version, après suppression des passages cités, des nombres longs et des adresses.

Questions fréquentes

Crée-t-il un dict avec mes données ?

Non. Il écrit des définitions de dataclasses qui décrivent les données. Pour obtenir un dict avec vos valeurs, utilisez json.loads sur le texte ; pour remplir une dataclass, passez les valeurs correspondantes à son constructeur, ou choisissez « Types et fonctions from_dict / to_dict » dans « Code » et appelez root_from_dict(json.loads(text)).

Comment les champs facultatifs et null sont-ils typés ?

Optional[T] = None, quand une clé manque dans certains éléments d’un tableau ou vaut null dans certains d’entre eux. Une clé qui vaut null dans tous les éléments n’a rien dont déduire un type et est typée None : donnez-lui une vraie valeur dans l’échantillon si vous voulez un type. Dans un TypedDict, une telle clé est Optional[T] dans une partie déclarée avec total=False.

Génère-t-il des modèles Pydantic ?

Oui. Choisissez « Modèles Pydantic » dans « Modèle » : chaque classe hérite alors de BaseModel, et un champ dont le nom diffère de sa clé JSON, comme first_name pour first-name, reçoit Field(alias="first-name"), si bien que Root.model_validate(data) lit le JSON et que model_dump(by_alias=True) le réécrit. Un champ qui masquerait une méthode de BaseModel, comme json, est renommé json_.

Peut-il écrire un TypedDict au lieu de classes ?

Oui. Choisissez « TypedDict » dans « Modèle » pour décrire le dict que renvoie json.loads, sans le convertir : les clés restent les clés JSON, une clé qui n’est pas un nom Python, comme first-name, utilise la forme TypedDict("Name", {...}), un enum d’un JSON Schema devient un Literal, et une date reste str. TypedDict demande Python 3.8 ou ultérieure.

Puis-je partir d’un JSON Schema ?

Oui. Choisissez « JSON Schema » dans « Source », puis collez ou ouvrez le schéma. Les types, les propriétés obligatoires (les autres deviennent Optional avec = None), les enums (une classe Enum) et les formats date-time (datetime) viennent du schéma. Un $ref n’est suivi qu’à l’intérieur du document (#/definitions/… ou #/$defs/…) : un schéma situé à une autre adresse n’est jamais téléchargé, et la page le signale.

Les nombres entiers et décimaux sont-ils distingués ?

Oui. Les nombres entiers sont typés int, et les nombres écrits avec un point décimal ou un exposant sont typés float, même 10.0 : une valeur reçue plus tard, comme 10.5, correspond encore à l’annotation.

Trucs et astuces

  • ✓Renommez RootElement ou Root avec un nom qui décrit vos enregistrements avant d’utiliser les classes.