CodeGym /Cours /Python SELF FR /Travailler avec JSON via json

Travailler avec JSON via json

Python SELF FR
Niveau 23 , Leçon 1
Disponible

2.1 Module json

JSON (JavaScript Object Notation) — est un format léger d'échange de données qui est facile à lire et à écrire pour les humains, et simple à analyser et générer pour les ordinateurs. JSON est souvent utilisé pour transférer des données entre un serveur et une application web, ainsi que pour stocker des configurations et des paramètres.

Le module json en Python fournit des fonctions pour la sérialisation (conversion des objets Python en chaînes JSON) et la désérialisation (conversion des chaînes JSON en objets Python). Ce module est intégré dans la bibliothèque standard de Python et est couramment utilisé pour travailler avec les données JSON.

Les fonctions principales du module json ressemblent beaucoup à celles de pickle et fonctionnent de manière similaire. Que voulez-vous — c'est le standard!

  • Travail avec des chaînes :
    • json.dumps(obj) — Convertit un objet Python en chaîne JSON.
    • json.loads(s) — Convertit une chaîne JSON en objet Python.
  • Travail avec des fichiers :
    • json.dump(obj, file) — Sérialise un objet Python et l'écrit dans un fichier texte.
    • json.load(file) — Désérialise un objet Python à partir d'un fichier texte contenant des données au format JSON.

Voyons quelques exemples pour mieux comprendre le fonctionnement de ces fonctions.

2.2 Sérialisation en chaîne

Sérialisation des objets Python en chaînes JSON

Pour sérialiser un objet en une chaîne, il suffit de le passer à la fonction json.dumps().


import json

# Exemple d'objet pour la sérialisation
data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"],
    "address": {
        "city": "New York",
        "zip_code": "10001"
    }
}
            
# Conversion de l'objet Python en chaîne JSON
json_string = json.dumps(data, indent=4)
print("Données sérialisées (JSON):", json_string)
        

Désérialisation des chaînes JSON en objets Python

Pour récupérer un objet à partir d'une chaîne, il suffit de passer la chaîne JSON, contenant la description de l'objet, à la méthode json.loads().


import json

# Exemple de chaîne JSON pour la désérialisation
json_string = '''
    {
        "name": "Alice",
        "age": 30,
        "is_student": false,
        "courses": ["Math", "Science"],
        "address": {
          "city": "New York",
          "zip_code": "10001"
        }
    }
    '''
            
# Conversion de la chaîne JSON en objet Python
data = json.loads(json_string)
print("Données désérialisées (Python):", data)
        

2.3 Sérialisation dans un fichier

Écriture d'objets Python dans un fichier au format JSON

Pour écrire un objet dans un fichier, on utilise la méthode json.dump(). Lors du travail avec des fichiers, il est important d'utiliser la gestion des exceptions, pour traiter correctement les erreurs potentielles. Voici un exemple :


import json

# Exemple d'objet pour la sérialisation
data = {
    "name": "Bob",
    "age": 25,
    "is_student": True,
    "courses": ["History", "Literature"],
    "address": {
        "city": "Los Angeles",
        "zip_code": "90001"
    }
}
            
# Écriture de l'objet Python dans un fichier JSON avec gestion des exceptions
try:
    with open('data.json', 'w') as file:
        json.dump(data, file, indent=4)
    print("Données écrites avec succès dans le fichier.")
except IOError:
    print("Erreur lors de l'écriture dans le fichier.")
except json.JSONEncodeError:
    print("Erreur lors de l'encodage JSON.")
            
        

Lecture d'objets Python à partir d'un fichier au format JSON

La lecture est aussi très simple — on passe le fichier à la méthode json.load(). Ici aussi, il est important d'utiliser la gestion des exceptions :


import json

# Lecture de l'objet Python à partir du fichier JSON avec gestion des exceptions
try:
    with open('data.json', 'r') as file:
        data = json.load(file)
    print("Données désérialisées du fichier (Python):", data)
except IOError:
    print("Erreur lors de la lecture du fichier.")
except json.JSONDecodeError:
    print("Erreur lors du décodage JSON.")
        

2.4 Paramètres supplémentaires des fonctions

Dans la fonction qui s'occupe de la sérialisation, vous pouvez passer des paramètres supplémentaires pour rendre votre JSON plus joli :

  • skipkeys: Si True, ignore les clés qui ne sont pas des chaînes, des nombres ou None.
  • ensure_ascii: Si True, tous les caractères non ASCII seront échappés à l'aide de séquences d'échappement Unicode.
  • indent: Si un nombre est indiqué, des indentations seront ajoutées pour une meilleure lisibilité.
  • sort_keys: Si True, les clés dans le JSON seront triées par ordre alphabétique.

Exemple d'utilisation des paramètres json.dumps():


import json

data = {"c": 3, "b": 2, "a": 1}
            
# Sérialisation avec tri des clés et indentations
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
        

2.5 Décodeurs et encodeurs personnalisés

Le module json permet d'utiliser des fonctions personnalisées pour la sérialisation et la désérialisation des objets.

Exemple d'encodeur personnalisé

D'abord, nous créons une classe codeur spéciale, qui à l'intérieur vérifie, si le type de l'objet == datetime, retourne l'objet comme une chaîne au format ISO.


import json
from datetime import datetime
            
class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        return super().default(obj)
            
data = {
    "name": "Alice",
    "timestamp": datetime.now()
}
            
# Sérialisation avec un encodeur personnalisé
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)

Exemple de décodeur personnalisé

Pour l'opération inverse, nous avons également besoin d'une fonction qui convertit la chaîne en date. Par exemple, on peut simplement vérifier le nom du champ, et si c'est "timestamp", convertir la chaîne en objet datetime:


import json
from datetime import datetime
        
def custom_decoder(dct):
    if 'timestamp' in dct:
        dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
    return dct
        
json_string = '''
{
    "name": "Alice",
    "timestamp": "2023-05-15T14:30:00"
}
'''
        
# Désérialisation avec un décodeur personnalisé
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
    
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION