Le format JSON et son utilisation avec Python

JSON (JavaScript Object Notation) est le nom d'un format d'échange de données.

C'est un format standard, couramment utilisé pour structurer des données de manière similaire aux objets JavaScript.

Il est souvent employé pour organiser et transférer des informations sur un site web.

Par exemple, il permet d'envoyer des données depuis un serveur vers un client afin de les afficher sur une page web ou inversement.

Bien qu'originellement créé pour une utilisation avec le langage JavaScript, ce format étant basé entièrement sur du texte, il est possible de l'utiliser avec d'autres langages.

JSON est donc bien un format et non pas un langage de programmation en soi.

Avec Python, on peut utiliser le module json disponible dans la bibliothèque standard pour lire ces fichiers.

Un fichier JSON peut contenir les types de données suivants :

Dans le format JSON, certains types de données seront notés différemment de ce à quoi nous sommes habitués avec Python :

  • Pour les chaînes de caractères, seuls les guillemets doubles sont acceptés.
  • Les booléens s'écrivent en minuscule (true et false au lieu de True et False).
  • L'objet None est représenté par null.

Il est important de noter qu'un fichier JSON ne peut contenir qu'un seul objet.

Ainsi, si vous souhaitez stocker plusieurs chaînes de caractères dans un fichier JSON, vous devrez par exemple les inclure dans une liste.

Ce fichier JSON est donc valide :

["Pascal", "Patrick"]

Mais pas celui-ci :

"Pascal"
"Patrick"

Vous pouvez par contre sans problème stocker une seule valeur.

Un fichier JSON peut donc contenir une chaîne de caractères ou un nombre.

"Patrick"
2938.231

Dès que vous souhaitez stocker plusieurs objets, il faut donc passer par une liste ou un dictionnaire.

Voici quelques exemples de fichiers JSON valides :

{
    "Patrick": {
        "salaire": 24000,
        "date_embauche": "2020-10-25",
        "manager": true
    },
    "Pascal": {
        "salaire": 35000,
        "date_embauche": "2020-08-17",
        "manager": false
    }
}
{
    "Cahiers": 3,
    "Stylos": 2,
    "Agrafes": null
}
[1, 4, 2, 3, 1, 76, 4, 23, 4]
["Bonjour", null, "test", 34, 9.743, false]

De nombreux outils en ligne (comme jsonlint) vous permettent de vous assurer de la validité d'un fichier JSON.

Le module json se charge automatiquement de convertir les données JSON dans un format de donnée valide pour Python.

Si par exemple votre fichier JSON contient le booléen true, vous récupérerez bien un booléen (True) et non pas la chaîne de caractères "true". Pas besoin donc de faire la moindre conversion que ce soit.

N'essayez donc pas de lire un fichier json avec la méthode read. Cette méthode vous retournerait le fichier JSON en entier sous forme de chaîne de caractères et non pas d'objets.

Lire un fichier JSON

Pour lire un fichier JSON, on utilise la fonction load du module json.

Il faudra au préalable ouvrir le fichier en mode lecture, par exemple avec l'instruction with :

import json

with open("/chemin/vers/le_fichier.json", "r") as f:
    data = json.load(f)

On passe à la fonction load l'objet qui correspond au fichier ouvert, qui dans le cas ci-dessus est contenu dans la variable f.

Si vous essayez de lire un fichier JSON qui contient des données invalides, vous obtiendrez une erreur de type JSONDecodeError.

Écrire dans un fichier JSON

Pour écrire dans un fichier JSON, on utilise la fonction dump du module json.

Là encore, il faudra au préalable ouvrir le fichier, cette fois-ci en mode écriture :

import json

data = [1, 2, 3, 4, 5]

with open("/chemin/vers/le_fichier.json", "w") as f:
    json.dump(data, f)

On passe en premier à la fonction dump l'objet que l'on souhaite écrire (ici, l'objet data) et en deuxième le fichier dans lequel on veut écrire (ici, la variable f).

Si jamais vous ne vous souvenez plus dans quel ordre vous devez spécifier les arguments, pensez de façon logique. On indique ce que l'on veut écrire (les données), et ensuite dans quoi on veut les écrire (le fichier).

La fonction dump contient un paramètre indent auquel on peut passer un nombre entier.

Cela permet d'organiser vos données de façons plus claires dans le fichier JSON en spécifiant un nombre d'espaces selon lequel indenter l'objet écrit (un peu comme le fait le module pprint).

Sans indent :

import json

data = {
    "Cahiers": 3,
    "Stylos": 2,
    "Agrafes": None
}

with open("/Users/thibh/test.json", "w") as f:
    json.dump(data, f)

Le fichier JSON contiendra :

{"Cahiers": 3, "Stylos": 2, "Agrafes": null}

Avec un indent de 2 :

import json

data = {
    "Cahiers": 3,
    "Stylos": 2,
    "Agrafes": None
}

with open("/Users/thibh/test.json", "w") as f:
    json.dump(data, f, indent=2)
{
  "Cahiers": 3,
  "Stylos": 2,
  "Agrafes": null
}

Avec un indent de 4 :

import json

data = {
    "Cahiers": 3,
    "Stylos": 2,
    "Agrafes": None
}

with open("/Users/thibh/test.json", "w") as f:
    json.dump(data, f, indent=4)
{
    "Cahiers": 3,
    "Stylos": 2,
    "Agrafes": null
}

Exemple : sauvegarder un booléen

Imaginons le cas suivant : on veut sauvegarder dans un fichier JSON la valeur d'un booléen pour lire cette valeur de nouveau par la suite.

On aura donc le script suivant pour sauvegarder le booléen :

import json

with open("/chemin/vers/fichier.json", "w") as f:
    json.dump(True, f)

À ce stade-ci, mon fichier JSON sur le disque contiendra ceci :

true

Rappelez-vous, avec le format JSON, les booléens sont en minuscule. Le module json de Python se charge donc automatiquement de faire la conversion pour nous.

Par la suite, quand on récupère la valeur du booléen sauvegardé dans le fichier JSON, on remarque que l'objet récupéré est là encore directement reconnu par Python comme un booléen :

import json

with open("/chemin/vers/fichier.json", "r") as f:
    data = json.load(f)

print(data)  # True
print(type(data))  # <class 'bool'>