Python JSON : encodage, décodage et gestion de fichiers – Guide pratique
Python JSON : encodage, décodage et gestion de fichiers – Guide pratique
Qu'est-ce que JSON en Python ?
JSON — abréviation de JavaScript Object Notation — est le format d'échange de données textuel le plus utilisé. En Python, il correspond directement aux structures de données natives : les objets deviennent des dict, les tableaux deviennent des list, les chaînes, nombres, booléens et null traduisent en str, int/float, bool et None respectivement. Le module json de la bibliothèque standard gère toutes les conversions.
Bibliothèque JSON en Python
Importez le module une fois dans votre script :
import json
Le module offre quatre méthodes principales :
| Méthode | Description |
|---|---|
| dumps() | Convertir un objet Python en chaîne JSON. |
| dump() | Écrire une chaîne JSON directement dans un objet fichier. |
| loads() | Analyser une chaîne JSON en objet Python. |
| load() | Lire et analyser un fichier JSON en objet Python. |
Python vers JSON (Encodage)
L'encodage est le processus de conversion des types de données Python en JSON. Le mappage par défaut est montré ci-dessous :
| Python | JSON |
|---|---|
| dict | Object |
| list | Array |
| str | String |
| int | Number (int) |
| float | Number (real) |
| True | true |
| False | false |
| None | null |
Exemple utilisant json.dumps() :
import json
x = {
"name": "Ken",
"age": 45,
"married": True,
"children": ("Alice", "Bob"),
"pets": ["Dog"],
"cars": [
{"model": "Audi A1", "mpg": 15.1},
{"model": "Zeep Compass", "mpg": 18.1}
]
}
# Jolie impression avec clés triées
chaine_triee = json.dumps(x, indent=4, sort_keys=True)
print(chaine_triee)
Sortie :
{
"age": 45,
"cars": [
{ "model": "Audi A1", "mpg": 15.1 },
{ "model": "Zeep Compass", "mpg": 18.1 }
],
"children": [ "Alice", "Bob" ],
"married": true,
"name": "Ken",
"pets": [ "Dog" ]
}
Écrire un objet JSON dans un fichier est simple avec json.dump() :
with open('json_file.json', 'w') as fichier_ecriture:
json.dump(x, fichier_ecriture, indent=4, sort_keys=True)
Après exécution du script, json_file.json contiendra les données sérialisées.
JSON vers Python (Décodage)
Le décodage inverse le mappage, transformant une chaîne ou fichier JSON en objets Python natifs. La table de conversion miroir la table d'encodage :
| JSON | Python |
|---|---|
| Object | dict |
| Array | list |
| String | str |
| Number (int) | int |
| Number (real) | float |
| true | True |
| false | False |
| null | None |
Exemple utilisant json.loads() :
import json
donnees_personne = '{"person": {"name": "Kenn", "sex": "male", "age": 28}}'
obj = json.loads(donnees_personne)
print(obj)
print(type(obj))
print(obj.get('person'))
Sortie :
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
<class 'dict'>
{'name': 'Kenn', 'sex': 'male', 'age': 28}
Lire un fichier JSON directement :
with open('json_file.json') as f:
donnees = json.load(f)
print(donnees)
Sortie :
{'name': 'Ken', 'age': 45, ...}
Encodage compact et joli
Pour la transmission réseau, l'encodage compact supprime les espaces :
lst = ['a', 'b', 'c', {"4": 5, "6": 7}]
compact = json.dumps(lst, separators=(',', ':'))
print(compact)
Sortie :
["a","b","c",{"4":5,"6":7}]
Pour la lisibilité humaine, le joli affichage utilise l'indentation :
dic = {"a": 4, "b": 5}
joli = json.dumps(dic, indent=4, separators=(',', ': '))
print(joli)
Sortie :
{
"a": 4,
"b": 5
}
Encodage d'objets complexes
Le module json ne peut pas sérialiser d'objets arbitraires. Pour gérer un nombre complex, fournissez une fonction default :
def encoder_complexe(o):
if isinstance(o, complex):
return [o.real, o.imag]
raise TypeError(f"{repr(o)} n'est pas sérialisable en JSON")
print(json.dumps(4 + 5j, default=encoder_complexe))
Sortie :
[4.0, 5.0]
Décodage d'objets complexes
Utilisez object_hook pour détecter un marqueur personnalisé et reconstruire le nombre complexe :
def est_complexe(obj):
if "__complex__" in obj:
return complex(obj["real"], obj["img"])
return obj
objet_complexe = json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook=est_complexe)
print(objet_complexe)
Sortie :
(4+5j)
Classes de sérialisation et désérialisation
Les classes JSONEncoder et JSONDecoder fournissent un contrôle fin :
JSONEncoder.default(o)– redéfinir pour sérialiser des objets personnalisés.JSONEncoder.encode(o)– renvoyer une chaîne JSON.JSONEncoder.iterencode(o)– itérer sur la chaîne de sortie.JSONDecoder.decode(s)– analyser une chaîne JSON.JSONDecoder.raw_decode(s)– analyser à partir d'un index donné.
Exemple :
from json.encoder import JSONEncoder
print(JSONEncoder().encode({"couleur": ["rouge", "jaune", "vert"]}))
Récupérer du JSON depuis une URL
Utiliser requests pour télécharger un flux JSON en direct (ex. : CityBike NYC) :
import json, requests
reponse = requests.get("https://feeds.citibikenyc.com/stations/stations.json")
velo_dict = json.loads(reponse.text)
print(velo_dict['stationBeanList'][0])
Sortie :
{'id': 487, 'stationName': 'E 20 St & FDR Drive', 'availableDocks': 24, ...}
Gestion des exceptions JSON
L'exception principale est json.JSONDecodeError, une sous-classe de ValueError. Exemple de gestion :
try:
with open('bad.json') as f:
donnees = json.load(f)
except json.JSONDecodeError as e:
print(f"JSON invalide : {e}")
Valeurs numériques spéciales
RFC 8259 n'autorise pas Infinity ou NaN, mais l'encodeur Python les représente comme chaînes :
print(json.dumps(float('inf')))
print(json.dumps(float('nan')))
Sortie :
Infinity NaN
Clés répétées en JSON
Quand une clé apparaît plusieurs fois, json.loads() de Python ne garde que la dernière occurrence :
json.loads('{"a": 1, "a": 2, "a": 3}') # -> {'a': 3}
Outils en ligne de commande
Le module json.tool formate et valide JSON depuis la ligne de commande :
$ echo '{"name": "Kings Arthur"}' | python3 -m json.tool
{
"name": "Kings Arthur"
}
Avantages de JSON en Python
- Support natif via le module
json. - Lisible par l'humain avec joli affichage.
- Largement adopté pour APIs, configuration et stockage de données.
- Indépendant du langage et léger.
Limitations
- Ne supporte pas les types de données personnalisés sans encodeur personnalisé.
- Profondeur de récursion maximale limite les structures profondément imbriquées.
- Les gros documents peuvent être gourmands en mémoire à charger entièrement.
Feuille de triche Python JSON
| Fonction | Description |
|---|---|
| json.dumps(obj) | Sérialiser objet Python en chaîne JSON. |
| json.dump(obj, fichier) | Écrire chaîne JSON dans un fichier. |
| json.dumps(obj, separators=(",", ":")) | Représentation compacte sans espaces. |
| json.dumps(obj, indent=4) | JSON joli avec indentation. |
| json.dumps(obj, sort_keys=True) | Trier clés dictionnaire alphabétiquement. |
| json.dumps(obj, default=custom) | Encoder objets non supportés. |
| JSONEncoder().encode(obj) | Sérialisation manuelle via classe encodeur. |
| json.loads(s) | Analyser chaîne JSON en objet Python. |
| json.loads(s, object_hook=custom) | Logique de désérialisation personnalisée. |
| JSONDecoder().decode(s) | Désérialisation manuelle via classe décodeur. |
Python
- Maîtriser les types de données Python : Guide pratique
- Maîtriser les opérateurs Python : Guide complet
- Maîtriser l'instruction pass en Python : Guide pratique
- Maîtriser les arguments de fonctions Python : Positionnels, nommés et paramètres par défaut
- Maîtriser les dictionnaires Python : création, manipulation et techniques avancées
- Entrées/sorties de fichiers Python : maîtriser les opérations sur les fichiers
- Lecture de Fichiers en Java avec BufferedReader – Guide Pratique avec Exemples
- Vérifier l'existence de fichiers et répertoires en Python – Guide pratique
- Entrées/Sorties de fichiers en Python : Maîtriser les opérations de lecture et d'écriture