Menu
Français

Python JSON : lire, écrire et parser du JSON avec le module json

Comment lire et écrire du JSON en Python — loads, dumps, lire depuis des fichiers, pretty printing, et gérer les cas limites qui apparaissent avec les vraies données.

JSON et Python parlent les mêmes formes

JSON est le format par défaut pour les API, les fichiers de config et l'échange de données sur le web. Heureusement pour les programmeurs Python, un objet JSON correspond directement à un dict Python, un tableau JSON à une liste, une chaîne JSON à une str. Cet alignement étroit est pourquoi lire et écrire du JSON en Python est une opération de deux lignes.

Le module json de la bibliothèque standard gère les deux directions.

Parser une chaîne JSON

json.loads(text) — « load string » — prend une chaîne au format JSON et renvoie l'objet Python qu'elle représente :

main.py
Output
Click Run to see the output here.

Le résultat est un simple dict. Tu accèdes à ses clés comme à n'importe quel dict — pas de wrapper JSON spécial, pas de méthode .parse() sur le résultat.

Si la chaîne n'est pas du JSON valide, json.loads lève json.JSONDecodeError. Le message d'erreur inclut la ligne et la colonne du problème, ce qui suffit généralement pour repérer une virgule manquante ou un guillemet non échappé.

Écrire du JSON comme une chaîne

json.dumps(data) — « dump string » — fait l'inverse : prend un objet Python et renvoie une chaîne JSON :

main.py
Output
Click Run to see the output here.

True, False et None de Python sont traduits automatiquement en true, false et null de JSON. Les nombres et les chaînes passent sans changement. Les listes deviennent des arrays, les dicts deviennent des objects.

Pretty printing

La sortie par défaut de json.dumps est compacte — bien pour le transport réseau, dur pour les humains. Passe indent=2 pour quelque chose de plus lisible :

main.py
Output
Click Run to see the output here.

Quelques autres options de dumps à connaître :

  • sort_keys=True — trie les clés d'objet par ordre alphabétique. Utile pour une sortie déterministe (fichiers de config, fixtures de tests, diffs).
  • ensure_ascii=False — écrit les caractères non ASCII (é, ü, 中) tels quels au lieu d'échappements \u. Généralement le bon choix pour les fichiers UTF-8.
  • separators=(",", ":") — la sortie la plus serrée possible. Combiné avec ensure_ascii=False, ça donne le JSON UTF-8 le plus compact qu'on puisse produire.

Lire du JSON depuis un fichier

json.load(file) — sans s — lit directement depuis un objet fichier. Le motif courant l'associe à with open :

import json

with open("config.json") as f:
    config = json.load(f)

print(config["version"])

Pas besoin de lire tout le fichier dans une chaîne d'abord ; json.load streame à travers l'objet fichier.

Écrire du JSON dans un fichier

json.dump(data, file) est le contrepartie pour l'écriture de fichier :

import json

data = {"created": "2026-01-01", "items": [1, 2, 3]}

with open("state.json", "w") as f:
    json.dump(data, f, indent=2)

L'option indent fonctionne ici aussi. Ouvre le fichier résultant et tu verras un document JSON joliment formaté.

Lire une réponse d'API JSON

La plupart des bibliothèques HTTP te donnent des bytes ou du texte ; tu appelles json.loads pour les transformer en données utilisables :

import json
import urllib.request

with urllib.request.urlopen("https://api.example.com/users/1") as response:
    text = response.read().decode("utf-8")

user = json.loads(text)
print(user["name"])

La bibliothèque requests (couverte séparément) saute une étape — elle a une méthode .json() sur la réponse qui appelle json.loads pour toi.

Ce que JSON peut et ne peut pas représenter

Le système de types de JSON est plus étroit que celui de Python. La correspondance dans les deux directions :

PythonJSON
dictobject
list, tuplearray
strstring
int, floatnumber
Truetrue
Falsefalse
Nonenull

Les tuples reviennent en listes — le caractère tuple est perdu. Les sets, classes personnalisées et objets datetime ne peuvent pas être sérialisés par défaut ; tu obtiens TypeError: Object of type X is not JSON serializable.

Gérer datetime et objets personnalisés

Deux approches courantes.

Convertis en structure JSON-safe d'abord. Fais la transformation dans ton propre code, puis sérialise un simple dict :

main.py
Output
Click Run to see the output here.

Passe une fonction default=. json.dumps l'appelle pour chaque valeur qu'il ne sait pas sérialiser :

main.py
Output
Click Run to see the output here.

Quand tu relis les données, tu dois convertir ces chaînes ISO en datetime toi-même — JSON ne se souvient pas de ce qu'elles étaient à l'origine.

Aller-retour d'un dict à travers JSON

Un test rapide que les dicts survivent :

main.py
Output
Click Run to see the output here.

Les valeurs sont égales, mais ce sont des objets différents. C'est souvent ce que tu veux — json.dumps + json.loads est un moyen peu coûteux de faire une copie profonde de toute structure compatible JSON.

Un exemple réaliste

Un petit script qui charge une config JSON, met à jour un champ et la sauvegarde :

import json
from pathlib import Path

config_path = Path("settings.json")

# Charger (avec un défaut si le fichier n'existe pas).
if config_path.exists():
    config = json.loads(config_path.read_text())
else:
    config = {"theme": "dark", "last_opened": None}

# Mettre à jour.
config["last_opened"] = "2026-01-15"

# Sauvegarder, pretty-printed.
config_path.write_text(json.dumps(config, indent=2, ensure_ascii=False))

C'est un cycle complet « lire, modifier, écrire » du JSON en une douzaine de lignes.

Quelques habitudes

  • Utilise with open(...) pour les fichiers, toujours. JSON, c'est juste du texte ; toutes les règles de gestion de fichier s'appliquent.
  • Préfère indent=2 pour les fichiers que les humains lisent — config, fixtures, données exportées. Saute-le pour le trafic réseau où la compacité compte.
  • Mets ensure_ascii=False pour une sortie UTF-8 pour que les noms avec accents ou caractères non latins restent lisibles.
  • Valide avec try/except json.JSONDecodeError quand tu parses des données que tu n'as pas produites.

Ensuite

JSON gère les données clé-valeur. Le prochain outil du même chapitre est CSV — le support intégré de Python pour le format tabulaire derrière la plupart des exports de tableur que tu rencontreras.

Questions fréquentes

Comment parser du JSON en Python ?

Utilise json.loads(text) pour une chaîne JSON ou json.load(file) pour un objet fichier. Les deux renvoient un dict Python (ou une liste, selon le JSON). Exemple : data = json.loads('{"name": "Rosa"}')data['name'] vaut 'Rosa'.

Comment convertir un dictionnaire Python en JSON ?

json.dumps(my_dict) renvoie une chaîne JSON. json.dump(my_dict, file) écrit directement dans un objet fichier. Passe indent=2 pour une sortie pretty-printed : json.dumps(data, indent=2).

Quelle est la différence entre json.loads et json.load ?

loads (avec le s) prend une chaîne. load (sans s) prend un objet fichier. Pareil pour dumps vs dump. Le s, c'est pour string ; c'est la façon la plus facile de se rappeler lequel est lequel.

Comment gérer les dates et objets personnalisés en JSON ?

JSON n'a pas de type date, donc passe les dates comme chaînes ISO-8601 et reparse-les manuellement. Pour les classes personnalisées, soit fournis une fonction default= à json.dumps qui renvoie une représentation JSON-safe, soit convertis en dict toi-même avant de sérialiser.

Apprendre à coder avec Coddy

COMMENCER