Image par auteur
Lors de la création d’applications en Python, JSON est l’un des formats de données courants avec lesquels vous travaillerez. Et si vous avez déjà travaillé avec des API, vous êtes probablement déjà familiarisé avec l’analyse des réponses JSON des API.
Comme vous le savez, JSON est un format texte pour l’échange de données, qui stocke les données dans des paires clé-valeur et est lisible par l’homme. Et les dictionnaires Python stockent les données dans des paires clé-valeur. Ce qui rend intuitif le chargement de chaînes JSON dans des dictionnaires pour le traitement et également le transfert des données des dictionnaires dans les chaînes JSON.
Dans ce tutoriel, nous allons apprendre à convertir un dictionnaire Python en JSON à l’aide de l’outil module json intégré. Alors commençons à coder !
Pour convertir un dictionnaire Python en chaîne JSON, vous pouvez utiliser le dumps()
fonction du module json. Le dumps()
La fonction prend un objet Python et renvoie la représentation sous forme de chaîne JSON. En pratique, cependant, vous devrez convertir non pas un seul dictionnaire mais un ensemble tel qu’une liste de dictionnaires.
Alors choisissons un tel exemple. Disons que nous avons books
, une liste de dictionnaires, où chaque dictionnaire contient des informations sur un livre. Ainsi, chaque enregistrement de livre se trouve dans un dictionnaire Python avec les clés suivantes : titre, auteur, année_de publication et genre.
En appelant json.dumps()
nous définissons l’option indent
paramètre : l’indentation dans la chaîne JSON car elle contribue à améliorer la lisibilité (oui, nous sommes en train d’imprimer joliment le json ??) :
import json
books = [
{
"title": "The Great Gatsby",
"author": "F. Scott Fitzgerald",
"publication_year": 1925,
"genre": "Fiction"
},
{
"title": "To Kill a Mockingbird",
"author": "Harper Lee",
"publication_year": 1960,
"genre": "Fiction"
},
{
"title": "1984",
"author": "George Orwell",
"publication_year": 1949,
"genre": "Fiction"
}
]
# Convert dictionary to JSON string
json_string = json.dumps(books, indent=4)
print(json_string)
Lorsque vous exécutez le code ci-dessus, vous devriez obtenir un résultat similaire :
Output >>>
[
{
"title": "The Great Gatsby",
"author": "F. Scott Fitzgerald",
"publication_year": 1925,
"genre": "Fiction"
},
{
"title": "To Kill a Mockingbird",
"author": "Harper Lee",
"publication_year": 1960,
"genre": "Fiction"
},
{
"title": "1984",
"author": "George Orwell",
"publication_year": 1949,
"genre": "Fiction"
}
]
Ensuite, prenons une liste de dictionnaires Python imbriqués et obtenons-en la représentation JSON. Prolongons le books
dictionnaire en ajoutant une clé « avis ». Dont la valeur est une liste de dictionnaires, chaque dictionnaire contenant des informations sur un avis, à savoir « utilisateur », « note » et « commentaire ».
Nous modifions donc le books
dictionnaire comme ceci :
import json
books = [
{
"title": "The Great Gatsby",
"author": "F. Scott Fitzgerald",
"publication_year": 1925,
"genre": "Fiction",
"reviews": [
{"user": "Alice", "rating": 4, "comment": "Captivating story"},
{"user": "Bob", "rating": 5, "comment": "Enjoyed it!"}
]
},
{
"title": "To Kill a Mockingbird",
"author": "Harper Lee",
"publication_year": 1960,
"genre": "Fiction",
"reviews": [
{"user": "Charlie", "rating": 5, "comment": "A great read!"},
{"user": "David", "rating": 4, "comment": "Engaging narrative"}
]
},
{
"title": "1984",
"author": "George Orwell",
"publication_year": 1949,
"genre": "Fiction",
"reviews": [
{"user": "Emma", "rating": 5, "comment": "Orwell pulls it off well!"},
{"user": "Frank", "rating": 4, "comment": "Dystopian masterpiece"}
]
}
]
# Convert dictionary to JSON string
json_string = json.dumps(books, indent=4)
print(json_string)
Notez que nous utilisons la même valeur d’indentation de 4 et que l’exécution du script donne le résultat suivant :
Output >>>
[
{
"title": "The Great Gatsby",
"author": "F. Scott Fitzgerald",
"publication_year": 1925,
"genre": "Fiction",
"reviews": [
{
"user": "Alice",
"rating": 4,
"comment": "Captivating story"
},
{
"user": "Bob",
"rating": 5,
"comment": "Enjoyed it!"
}
]
},
{
"title": "To Kill a Mockingbird",
"author": "Harper Lee",
"publication_year": 1960,
"genre": "Fiction",
"reviews": [
{
"user": "Charlie",
"rating": 5,
"comment": "A great read!"
},
{
"user": "David",
"rating": 4,
"comment": "Engaging narrative"
}
]
},
{
"title": "1984",
"author": "George Orwell",
"publication_year": 1949,
"genre": "Fiction",
"reviews": [
{
"user": "Emma",
"rating": 5,
"comment": "Orwell pulls it off well!"
},
{
"user": "Frank",
"rating": 4,
"comment": "Dystopian masterpiece"
}
]
}
]
Le dumps
La fonction a plusieurs paramètres facultatifs. Nous avons déjà utilisé un de ces paramètres facultatifs indent
. Un autre paramètre utile est sort_keys
. Ceci est particulièrement utile lorsque vous devez trier les clés du dictionnaire Python lors de sa conversion en JSON.
Parce que sort_keys
est réglé sur False
par défaut, vous pouvez donc le définir sur True
si vous devez trier les clés lors de la conversion en JSON.
Voici un simple person
dictionnaire:
import json
person = {
"name": "John Doe",
"age": 30,
"email": "john@example.com",
"address": {
"city": "New York",
"zipcode": "10001",
"street": "123 Main Street"
}
}
# Convert dictionary to a JSON string with sorted keys
json_string = json.dumps(person, sort_keys=True, indent=4)
print(json_string)
Comme on le voit, les clés sont triées par ordre alphabétique :
Output >>>
{
"address": {
"city": "New York",
"street": "123 Main Street",
"zipcode": "10001"
},
"age": 30,
"email": "john@example.com",
"name": "John Doe"
}
Dans les exemples que nous avons codés jusqu’à présent, les clés et les valeurs du dictionnaire sont toutes sérialisables en JSON. Les valeurs étaient toutes des chaînes ou des entiers pour être précis. Mais ce n’est peut-être pas toujours le cas. Certains types de données non sérialisables courants incluent datetime
, Decimal
et set
.
Pas de soucis cependant. Vous pouvez gérer ces types de données non sérialisables en définissant des fonctions de sérialisation personnalisées pour ces types de données. Et puis régler le default
paramètre de json.dumps()
aux fonctions personnalisées que vous définissez.
Ces fonctions de sérialisation personnalisées devraient convertir les données non sérialisables dans un format sérialisable JSON (qui l’aurait deviné !).
Voici un simple data
dictionnaire:
import json
from datetime import datetime
data = {
"event": "Meeting",
"date": datetime.now()
}
# Try converting dictionary to JSON
json_string = json.dumps(data, indent=2)
print(json_string)
Nous avons utilisé json.dumps()
comme avant, nous allons donc rencontrer l’exception TypeError suivante :
Traceback (most recent call last):
File "/home/balapriya/djson/main.py", line 10, in
json_string = json.dumps(data, indent=2)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/json/__init__.py", line 238, in dumps
**kw).encode(obj)
^^^^^^^^^^^
...
File "/usr/lib/python3.11/json/encoder.py", line 180, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type datetime is not JSON serializable
La partie pertinente de l’erreur est la suivante : L’objet de type datetime n’est pas sérialisable JSON. Très bien, procédons maintenant comme suit :
- Définir un
serialize_datetime
fonction qui convertitdatetime
objets au format ISO 8601 en utilisant leisoformat()
méthode. - En appelant
json.dumps()
nous définissons ledefault
paramètre auserialize_datetime
fonction.
Le code ressemble donc à ceci :
import json
from datetime import datetime
# Define a custom serialization function for datetime objects
def serialize_datetime(obj):
if isinstance(obj, datetime):
return obj.isoformat()
data = {
"event": "Meeting",
"date": datetime.now()
}
# Convert dictionary to JSON
# with custom serialization for datetime
json_string = json.dumps(data, default=serialize_datetime, indent=2)
print(json_string)
Et voici le résultat :
Output >>>
{
"event": "Meeting",
"date": "2024-03-19T08:34:18.805971"
}
Et voila!
Pour récapituler : nous avons passé en revue la conversion d’un dictionnaire Python en JSON et l’utilisation du indent
et sort_keys
paramètres selon les besoins. Nous avons également appris à gérer les erreurs de sérialisation JSON.
Vous pouvez trouver les exemples de code sur GitHub. Je vous reverrai tous dans un autre tutoriel. En attendant, continuez à coder !
Bala Priya C est un développeur et rédacteur technique indien. Elle aime travailler à l’intersection des mathématiques, de la programmation, de la science des données et de la création de contenu. Ses domaines d’intérêt et d’expertise incluent le DevOps, la science des données et le traitement du langage naturel. Elle aime lire, écrire, coder et prendre le café ! Actuellement, elle travaille à l’apprentissage et au partage de ses connaissances avec la communauté des développeurs en créant des didacticiels, des guides pratiques, des articles d’opinion, etc. Bala crée également des aperçus de ressources attrayants et des didacticiels de codage.