Travailler avec des fichiers JSON en langage Python#
Le format JSON (JavaScript Object Notation) est le standard universel incontesté pour l'échange de données structurées sur le Web, les communications entre microservices (API REST), les configurations applicatives et le stockage NoSQL (MongoDB, ElasticSearch).
En Python, le module natif json permet de convertir instantanément des dictionnaires et listes en texte JSON (et inversement) sans aucune dépendance externe.
1. Table de correspondance des types Python \(\leftrightarrow\) JSON#
La force du format JSON réside dans sa quasi-équivalence syntaxique avec les structures de données natives de Python :
| Type Python | Type JSON équivalent | Exemple Python | Rendu JSON |
|---|---|---|---|
dict |
Objet (Object) | {"a": 1} |
{"a": 1} |
list, tuple |
Tableau (Array) | [1, 2], (1, 2) |
[1, 2] |
str |
Chaîne (String) | "texte" |
"texte" |
int, float |
Nombre (Number) | 42, 3.14 |
42, 3.14 |
True, False |
Booléens | True, False |
true, false (en minuscules) |
None |
Nul (Null) | None |
null |
2. Les 4 fonctions maîtresses du module json#
Pour ne jamais confondre ces fonctions, retenez la règle mnémonique :
- Les fonctions sans s (load, dump) s'appliquent à un Fichier (File stream).
- Les fonctions avec un s (loads, dumps) s'appliquent à une Chaîne de caractères (String).
flowchart TD
subgraph Fichiers sur Disque
F1[json.dump : Objet vers Fichier .json]
F2[json.load : Fichier .json vers Objet]
end
subgraph Chaines en Memoire
S1[json.dumps : Objet vers str JSON]
S2[json.loads : str JSON vers Objet]
end
3. Écriture et Lecture de fichiers : json.dump() et json.load()#
A. Écriture dans un fichier JSON avec mise en forme#
import json
base_clients = [
{
"id": 101,
"nom": "Alice Martin",
"ville": "Paris",
"commandes": [150.0, 89.90],
"vip": True
},
{
"id": 102,
"nom": "Koffi Mensah",
"ville": "Lome",
"commandes": [340.50],
"vip": False
}
]
with open("clients.json", "w", encoding="utf-8") as f:
# indent=4 : indentation lisible pour les humains
# ensure_ascii=False : conserve les accents français réels sans les encoder en \u00e9 !
json.dump(base_clients, f, indent=4, ensure_ascii=False)
print("Fichier 'clients.json' genere avec succes.")
B. Lecture et parsing depuis un fichier JSON#
with open("clients.json", "r", encoding="utf-8") as f:
donnees_chargees = json.load(f)
print(f"Nombre de clients charges : {len(donnees_chargees)}")
print("Premier client :", donnees_chargees[0]["nom"])
4. Manipulation de chaînes JSON : json.dumps() et json.loads()#
Ces méthodes sont incontournables lors de la consommation d'API web (avec la bibliothèque requests) :
import json
# 1. Parsing d'un JSON reçu sous forme de chaîne de caractères (json.loads)
payload_brut = '{"statut": "succes", "code": 200, "donnees": [10, 20, 30]}'
reponse_dict = json.loads(payload_brut)
print("Statut de l'API :", reponse_dict["statut"])
print("Donnees :", reponse_dict["donnees"])
# 2. Conversion d'un dictionnaire Python en chaîne formatée (json.dumps)
message_emission = {"alerte": "Température élevée", "valeur": 38.5}
chaine_json = json.dumps(message_emission, ensure_ascii=False)
print("Flux texte pret pour envoi :", chaine_json)
5. Gestion des objets non sérialisables (Ex: datetime)#
Par défaut, Python lève une exception TypeError: Object of type datetime is not JSON serializable si vous tentez d'exporter un objet date ou datetime.
Pour résoudre cette situation élégamment, passez le paramètre default=str :
from datetime import datetime
import json
evenement = {
"titre": "Atelier AlgoJungle Python",
"date_evenement": datetime(2026, 3, 3, 18, 0, 0),
"participants": 45
}
# default=str convertit automatiquement tout objet non supporté en sa représentation textuelle
json_texte = json.dumps(evenement, default=str, indent=4, ensure_ascii=False)
print(json_texte)
6. Mise en pratique : Système de gestion de configuration applicative#
Concevons un gestionnaire de configuration capable de charger un fichier de préférences, de le modifier et de l'enregistrer :
import json
import os
FICHIER_CONFIG = "config.json"
CONFIG_PAR_DEFAUT = {
"app_name": "AlgoJungle Analytics",
"version": "2.4.0",
"theme": "dark",
"max_connections": 100,
"debug_mode": False
}
def charger_configuration() -> dict:
"""Charge la configuration depuis le disque ou crée celle par défaut."""
if not os.path.exists(FICHIER_CONFIG):
print("Fichier de configuration inexistant. Creation avec les valeurs par defaut...")
with open(FICHIER_CONFIG, "w", encoding="utf-8") as f:
json.dump(CONFIG_PAR_DEFAUT, f, indent=4)
return CONFIG_PAR_DEFAUT.copy()
with open(FICHIER_CONFIG, "r", encoding="utf-8") as f:
return json.load(f)
def modifier_parametre(cle: str, nouvelle_valeur) -> None:
"""Met à jour un paramètre et persiste immédiatement la modification."""
config = charger_configuration()
config[cle] = nouvelle_valeur
with open(FICHIER_CONFIG, "w", encoding="utf-8") as f:
json.dump(config, f, indent=4)
print(f">>> Parametre '{cle}' mis a jour avec succes : {nouvelle_valeur}")
# Démonstration :
cfg = charger_configuration()
print("Theme actuel :", cfg["theme"])
# Modification persistante
modifier_parametre("theme", "light")
modifier_parametre("debug_mode", True)
7. Défi d'application#
Écrivez un script convertisseur_csv_vers_json.py qui lit un fichier CSV contenant des colonnes id,nom,filiere,moyenne et l'exporte sous la forme d'un tableau d'objets JSON dans un fichier etudiants.json, avec typage adéquat (id en entier, moyenne en flottant).
Commentaires