Travailler avec des fichiers JSON en Python

@joekakone

Joseph Konka @joekakone

03/03/2026 · 10 min

Maîtrisez la manipulation du format JSON en Python : sérialisation et désérialisation avec dump, load, dumps et loads, gestion des accents (ensure_ascii), indentation soignée et encodage d'objets complexes.

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

Inscrivez-vous à une formation complète

Voir le catalogue