Comment parser JSON avec Python

Nous allons vous guider à travers le processus d’importation de json et de son utilisation pour parser du JSON en Python, avec une table de transformation JSON-Python. Que vous soyez un développeur expérimenté ou que vous débutiez avec Python, ce tutoriel pas à pas va vous apprendre à parser des données JSON comme un pro !
13 min de lecture
How to parse JSON data with Python

Dans ce tutoriel, nous allons voir :

Introduction à JSON en Python

Avant de nous plonger dans le parsing de JSON avec Python, nous allons voir ce qu’est JSON et comment l’utiliser en Python.

Qu’est-ce que JSON ?

JSON, abréviation de JavaScript Object Notation, est un format d’échange de données léger. Il est simple à lire et à écrire pour les humains et facile à parser et à générer pour les machines. Cela en fait l’un des formats de données les plus populaires. Plus précisément, JSON est devenu le « langage du web », car il est couramment utilisé pour transmettre des données entre des serveurs et des applications web via des API.

Voici un exemple d’utilisation JSON :


{
  "name": "Maria Smith",
  "age": 32,
  "isMarried": true,
  "hobbies": ["reading", "jogging"],
  "address": {
    "street": "123 Main St",
    "city": "San Francisco",
    "state": "CA",
    "zip": "12345"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "555-555-1234"
    },
    {
      "type": "work",
      "number": "555-555-5678"
    }
  ],
  "notes": null
}

Comme vous pouvez le constater, JSON se compose de paires clé / valeur. Chaque clé est une chaîne et chaque valeur peut être une chaîne, un nombre, un booléen, un null, un tableau ou un objet. Bien qu’il soit similaire à un objet JavaScript, JSON peut être utilisé avec n’importe quel langage de programmation, y compris Python.

Comment utiliser JSON en Python ?

Python prend en charge JSON de manière native grâce au module json, qui fait partie de la bibliothèque standard de Python. Cela signifie que vous n’avez pas besoin d’installer une bibliothèque supplémentaire pour travailler avec JSON en Python. Vous pouvez importer json comme suit :

import json

La bibliothèque Python json intégrée contient une API complète pour traiter JSON. En particulier, elle dispose de deux fonctions clés : loads et load. La fonction loads vous permet de parser des données JSON à partir d’une chaîne de caractères. Notez que malgré le fait que son nom semble être au pluriel, la terminaison « s » signifie « string », chaîne de caractères. Il faut donc la lire comme « load-s ». D’autre part, la fonction load permet de parser les données JSON en octets.

Grâce à ces deux méthodes, json vous permet de convertir des données JSON en objets Python équivalents, tels que des dictionnaires et des lists, et vice versa. De plus, le module json vous permet de créer des encodeurs et des décodeurs personnalisés pour gérer des types de données spécifiques.

Poursuivez votre lecture pour découvrir comment utiliser la bibliothèque json pour parser des données JSON en Python !

Parser des données JSON avec Python

Nous allons jeter un coup d’œil à quelques exemples concrets et apprendre à parser des données JSON provenant de différentes sources dans différentes structures de données Python.

Convertir une chaîne JSON en un dictionnaire Python


Supposons que vous ayez des données JSON stockées dans une chaîne et que vous souhaitiez les convertir en un dictionnaire Python. Voici à quoi ressemblent les données JSON :

{
  "name": "iPear 23",
  "colors": ["black", "white", "red", "blue"],
  "price": 999.99,
  "inStock": true
}

Et voici sa représentation sous forme de chaîne en Python :

smartphone_json = '{"name": "iPear 23", "colors": ["black", "white", "red", "blue"], "price": 999.99, "inStock": true}'

Pensez à utiliser la convention des triples guillemets de Python pour stocker de longues chaînes JSON de plusieurs lignes.

Vous pouvez vérifier que « smartphone » contient une chaîne Python valide avec la ligne ci-dessous :

print(type(smartphone))

Cela affichera :

<class 'str'>

« str » correspond à « string » et signifie que la variable « smartphone » est du type de séquence texte.

Parsez la chaîne JSON contenue dans « smartphone » dans un dictionnaire Python avec la méthode json.loads() comme suit :

import json

# JSON string
smartphone_json = '{"name": "iPear 23", "colors": ["black", "white", "red", "blue"], "price": 999.99, "inStock": true}'
# from JSON string to Python dict
smartphone_dict = json.loads(smartphone_json)

# verify the type of the resulting variable
print(type(smartphone_dict)) # dict

Si vous exécutez cet extrait, vous obtiendrez :

<class 'dict'>

Fantastique ! smartphone_dict contient maintenant un dictionnaire Python valide !

Ainsi, pour convertir une chaîne JSON en un dictionnaire Python, il suffit de passer une chaîne JSON valide à la méthode json.loads()

Vous pouvez maintenant accéder aux champs du dictionnaire ainsi créé comme d’habitude :

product = smartphone_dict['product'] # smartphone
priced = smartphone['price'] # 999.99
colors = smartphone['colors'] # ['black', 'white', 'red', 'blue']

Gardez à l’esprit que la fonction json.loads () ne renvoie pas toujours un dictionnaire. Plus précisément, le type de données renvoyé dépend de la chaîne d’entrée. Par exemple, si la chaîne JSON contient une valeur basique, elle sera convertie en la valeur primitive Python correspondante :

import json
 
json_string = '15.5'
float_var = json.loads(json_string)

print(type(float_var)) # <class 'float'>

De même, une chaîne JSON contenant une liste de tableaux deviendra une liste Python :


import json
 
json_string = '[1, 2, 3]'
list_var = json.loads(json_string)
print(json_string) # <class 'list'>

Consultez la table de conversion ci-dessous pour voir comment les valeurs JSON sont converties en données Python par json :

Valeur JSONDonnées Python
stringstr
number (entier)int
number (réel)float
trueTrue
falseFalse
nullNone
arraylist
objectdict

Transformer une réponse de l’API JSON en un dictionnaire Python

Considérons que vous devez créer une API et convertir sa réponse JSON en un dictionnaire Python. Dans l’exemple ci-dessous, nous allons appeler le point de terminaison API suivant à partir du projet de placeholder {JSON} pour obtenir de fausses données JSON :

https://jsonplaceholder.typicode.com/todos/1

Cette API RESTFul renvoie la réponse JSON ci-dessous :

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

Vous pouvez appeler cette API avec le module urllib de la bibliothèque standard et convertir le JSON résultant en un dictionnaire Python comme suit :

import urllib.request
import json

url = "https://jsonplaceholder.typicode.com/todos/1"

with urllib.request.urlopen(url) as response:
     body_json = response.read()

body_dict = json.loads(body_json)
user_id = body_dict['userId'] # 1

urllib.request.urlopen() effectue l’appel API et renvoie un objet HTTPResponse. Sa méthode read () est ensuite utilisée pour obtenir le corps de la réponse body_json, qui contient la réponse de l’API sous la forme d’une chaîne JSON. Enfin, cette chaîne peut être analysée dans un dictionnaire Python via json.loads () comme expliqué précédemment.

Vous pouvez obtenir le même résultat avec les requêtes :

import requests
import json

url = "https://jsonplaceholder.typicode.com/todos/1"
response = requests.get(url)

body_dict = response.json()
user_id = body_dict['userId'] # 1

Notez que la méthode .json() transforme automatiquement l’objet de réponse contenant des données JSON dans la structure de données Python correspondante.

Super ! Vous savez maintenant comment parser une réponse API JSON en Python avec urllib et des requêtes.

Chargement d’un fichier JSON dans un dictionnaire Python

Supposons que vous ayez des données JSON stockées dans un fichier smartphone.json comme ci-dessous :

{
  "name": "iPear 23",
  "colors": ["black", "white", "red", "blue"],
  "price": 999.99,
  "inStock": true,
  "dimensions": {
    "width": 2.82,
    "height": 5.78,
    "depth": 0.30
  },
  "features": [
    "5G",
    "HD display",
    "Dual camera"
  ]
}

Votre objectif est de lire le fichier JSON et de le charger dans un dictionnaire Python. Vous y parviendrez avec le code ci-dessous :

import json

with open('smartphone.json') as file:
  smartphone_dict = json.load(file)

print(type(smartphone_dict)) # <class 'dict'>
features = smartphone_dict['features'] # ['5G', 'HD display', 'Dual camera']

La bibliothèque intégrée open() vous permet de charger un fichier et d’obtenir l’objet fichier correspondant. La méthode json.read() désérialise ensuite le fichier texte ou le fichier binaire contenant un document JSON en un objet Python équivalent. Dans ce cas, smartphone.json devient un dictionnaire Python.

Parfait, il ne faut que quelques lignes de code pour parser un fichier JSON en Python !

Créer un objet Python personnalisé à partir de données JSON

Vous voulez maintenant parser des données JSON dans une classe Python personnalisée. Voici à quoi ressemble votre classe Python personnalisée pour Smartphone :

class Smartphone:
    def __init__(self, name, colors, price, in_stock):
        self.name = name    
        self.colors = colors
        self.price = price
        self.in_stock = in_stock

Ici, l’objectif est de convertir la chaîne JSON suivante en une instance de Smartphone :

{
  "name": "iPear 23 Plus",
  "colors": ["black", "white", "gold"],
  "price": 1299.99,
  "inStock": false
}

Pour accomplir cette tâche, vous devez créer un décodeur personnalisé. Plus précisément, vous devez étendre la classe JSONDecoder et définir le paramètre object_hook dans la méthode __init__. Attribuez-lui le nom de la méthode de la classe contenant la logique de parsage personnalisée. Dans cette méthode de parsing, vous pouvez utiliser les valeurs contenues dans le dictionnaire standard renvoyé par json.read() pour instancier un objet Smartphone.

Définissez un SmartphoneDecoder personnalisé comme ci-dessous :

import json
 
class SmartphoneDecoder(json.JSONDecoder):
    def __init__(self, object_hook=None, *args, **kwargs):
        # set the custom object_hook method
        super().__init__(object_hook=self.object_hook, *args, **kwargs)

    # class method containing the 
    # custom parsing logic
    def object_hook(self, json_dict):
        new_smartphone = Smartphone(
            json_dict.get('name'), 
            json_dict.get('colors'), 
            json_dict.get('price'),
            json_dict.get('inStock'),            
        )

        return new_smartphone

Notez que vous devez utiliser la méthode get() pour lire les valeurs du dictionnaire dans la méthode object_hook() personnalisée. Cela permettra de s’assurer qu’aucune KeyError n’est déclenchée si une clé est manquante dans le dictionnaire. En effet, les valeurs None seront renvoyées.

Vous pouvez maintenant passer la classe SmartphoneDecoder au paramètre cls dans json.loads() pour convertir une chaîne JSON en un objet Smartphone :

import json

# class Smartphone:
# ...

# class SmartphoneDecoder(json.JSONDecoder): 
# ...

smartphone_json = '{"name": "iPear 23 Plus", "colors": ["black", "white", "gold"], "price": 1299.99, "inStock": false}'

smartphone = json.loads(smartphone_json, cls=SmartphoneDecoder)
print(type(smartphone)) # <class '__main__.Smartphone'>
name = smartphone.name # iPear 23 Plus

De même, vous pouvez utiliser SmartphoneDecoder avec json.load() :

smartphone = json.load(smartphone_json_file, cls=SmartphoneDecoder)

Et voilà ! Vous savez maintenant comment parser des données JSON en objets Python personnalisés !

Passer de données Python au format JSON

Vous pouvez également faire l’inverse et convertir les structures de données et les primitives Python en JSON. Cela est possible grâce aux fonctions json.dump() et json.dumps(), qui suivent la table de conversion ci-dessous :

Données PythonValeur JSON
strstring 
intnumber (entier)
floatnumber (réel)
Truetrue
False false
None null 
listarray
dictobject
Null None 

json.dump() vous permet d’écrire une chaîne JSON dans un fichier, comme dans l’exemple suivant :

import json

user_dict = {
    "name": "John",
    "surname": "Williams",
    "age": 48,
    "city": "New York"
}

# serializing the sample dictionary to a JSON file
with open("user.json", "w") as json_file:
    json.dump(user_dict, json_file)

Cet extrait sérialise la variable Python user_dict dans le fichier user.json.

De même, json.dumps() convertit une variable Python en une chaîne JSON équivalente :

import json

user_dict = {
    "name": "John",
    "surname": "Williams",
    "age": 48,
    "city": "New York"
}

user_json_string = json.dumps(user_dict)

print(user_json_string)

Exécutez cet extrait et vous obtiendrez :

C’est exactement la représentation JSON du dicton Python.

Notez que vous pouvez également spécifier un encodeur personnalisé, mais montrer comment le faire n’est pas le but de cet article. Suivez la documentation officielle pour en savoir plus.

Le module standard json est-il la meilleure ressource pour parser du JSON en Python ?

Comme c’est généralement le cas pour le parsing de données, le parsing JSON comporte des défis qu’il ne faut pas négliger. Par exemple, en cas de JSON invalide, cassé ou non standard, le module Python json ne saura pas quoi faire.

Vous devez également faire preuve de prudence lorsque vous parsez des données JSON provenant de sources non fiables. En effet, une chaîne JSON malveillante peut entraîner le blocage de votre parseur ou consommer une grande quantité de ressources. Il ne s’agit que d’un des nombreux défis que votre parseur de JSON Python doit prendre en compte.

Vous pouvez introduire une logique personnalisée pour traiter ces cas particuliers. En même temps, cela pourrait prendre trop de temps et résulter en un code trop complexe et peu fiable. C’est pourquoi vous devriez envisager d’utiliser un outil commercial qui facilite le parsing de JSON, tel que l’IDE Web Scraper.

L’IDE Web Scraping est spécialement conçue pour les développeurs et dispose d’un large éventail de fonctionnalités permettant de parser le contenu JSON et bien plus encore. Cet outil peut vous faire gagner beaucoup de temps et vous aider à sécuriser votre processus de parsing de JSON. De plus, il est fourni avec les capacités de proxy de déblocage de Bright Data pour appeler les API JSON de manière anonyme.

Si vous êtes pressé, vous pourriez également être intéressé par notre offre Data as a Service. Grâce à ce service, vous pouvez demander à Bright Data de vous fournir un jeu de données personnalisé qui répond à vos besoins spécifiques. Bright Data s’occupe de tout, aussi bien des performances que de la qualité des données.

Le parsing des données JSON n’a jamais été aussi simple !

Conclusion

Python vous permet de parser nativement les données JSON grâce au module standard json. Celui-ci contient une API puissante pour sérialiser et désérialiser le contenu JSON. Plus précisément, il fournit les méthodes json.read() et json.reads() pour traiter les fichiers JSON et les chaînes JSON, respectivement. Ici, vous avez vu comment les utiliser pour parser des données JSON en Python dans plusieurs exemples du monde réel. Dans le même temps, vous avez également compris les limites de cette approche. C’est pourquoi vous voudrez peut-être essayer une solution commerciale de pointe, entièrement fonctionnelle, pour le parsing de données, telle que l’IDE Web Scraper de Bright Data.