Présentation de JSON
JSON (JavaScript Object Notation) est un format d’échange de données dont la syntaxe s’inspire des objets littéraux JavaScript bien que JSON n’appartienne pas au JavaScript.
JSON peut représenter des nombres, des booléens, des chaînes, la valeur null, des séquences de valeurs ordonnées, des objets, etc. JSON ne représente pas nativement des types de données plus complexes tels que des fonctions, des expressions régulières, des dates, etc.
La légèreté, la simplicité et les performances de cette notation ont fait de JSON le standard pour l’échange de données. De nombreux langages -dont Python- proposent donc aujourd’hui leurs fonctions pour transformer des données en JSON et inversement.
Le format de données JSON
JSON est un format d’échange de données pensé pour gérer deux structures de données universelles :
- Une collection de paires nom / valeur. Dans les différentes langages, ce type de structure peut s’appeler objet, enregistrement, dictionnaire, table de hachage, liste à clé ou tableau associatif.
- Une liste ordonnée de valeurs. Dans la plupart des langages, c’est ce qu’on va appeler tableau, liste, vecteur ou séquence.
En JSON, ces deux structures se retrouvent sous les formes suivantes :
- Un objet est un ensemble non ordonnées de paires nom : valeur. Un objet commence avec
{
et se termine avec}
. Les noms sont suivis de:
et les pairesnom : valeur
sont séparées par des,
- Un tableau est une collection ordonnée de valeurs. Un tableau commence avec
[
et se termine avec]
. Les valeurs sont séparées par des,
Une valeur peut être une chaine de caractères entourées par des guillemets doubles, un nombre, un booléen, la valeur null, un objet ou un tableau.
Exemple de données au format JSON :
Le module Python json
Pour formater des données Python en JSON et inversement, nous allons utiliser le module Python standard json
.
Lorsqu’on encode des données au format JSON, on dit également qu’on “sérialise” les données. Ce terme fait référence à la transformation de données en une série d’octets. Le processus inverse de décodage de données encodées au format JSON est également appelé “désérialisation”.
La sérialisation des données Python
Pour sérialiser des données, c’est-dire pour convertir un objet Python en chaine JSON, nous allons pouvoir utiliser l’une des méthodes dump()
ou dumps()
du module json
.
La méthode dump()
permet d’enregistrer les données JSON dans un fichier tandis que dumps()
(=“dump string”) renvoie simplement les données sous forme de chaine JSON et nous permet de continuer à travailler avec elles.
Les objets Python vont être convertis selon la table d’équivalence suivante :
Python | JSON |
---|---|
dict |
object |
list , tuple |
array |
str |
string |
int , float |
number |
True |
true |
False |
false |
None |
null |
Prenons immédiatement un exemple :
Ici, on définit un dictionnaire Python pierre
qui contient des données de types différents.
On ouvre ensuite un fichier “pierre.json” en écriture avec open()
puis on écrit les données sérialisées à l’intérieur grâce à dump()
. On passe deux arguments à dump()
: les données à sérialisme et l’objet de type file (fichier) dans lequel elle doivent être écrites.
On utilise enfin la méthode dumps()
pour convertir à nouveau les données en chaine JSON et on les stocke dans une variable pour pouvoir s’en resservir dans elle reste du script. On affiche affiche le contenu de la variable qui est bien une chaine JSON constituée de différentes données formatées selon la table d’équivalence donnée ci-dessus.
En réalité, vous devez savoir que les méthodes dump()
et dumps()
acceptent de nombreux arguments qui vont nous permettre de personnaliser le comportement et notamment d’arranger nos données comme des arguments de type “indentation”, “séparateur” ou “classement des clefs” pour indenter les données, choisir nos séparateurs entre les valeurs ou classer les données par clefs.
La désérialisation des données JSON
De la même façon, nous allons pouvoir utiliser l’une des méthodes load()
et loads()
pour désérialiser des données JSON, c’st-à-dire pour convertir des données JSON en objet Python.
La méthode load()
permet de désérialiser des données JSON écrites dans un fichier tandis que loads()
permet de désérialiser des données directement sous forme due chaine JSON.
La table de conversion des donnés va être la même que la précédente. En reprenant notre exemple suivant, voici le résultat qu’on obtient :