Format JSON

RappelFormat reconnu pour l'échange de données entre applications

Un fichier JSON (JavaScript Object Notation) est un fichier texte (!) mais avec une structure standardisée permettant de rendre compte de l'organisation des données.

SyntaxeDifficultés

Les données en tableau :

Prenom

Nom

Email

Age

Ville

Robert

Lepingre

bobby@exemple.com

41

Paris

Jeanne

Ducoux

jeanne@exemple.com

32

Marseille

Pierre

Lenfant

pierre@exemple.com

23

Rennes

Comment sauvegarder ces données au format JSON :

  1. Comment sauvegarder un objet de type Personne dans un fichier ?

  2. Comment sauvegarder une collection (liste) de personnes ?

Idée : on peut utiliser le type dictionnaire, on obtiendra respectivement :

  1. {"Prenom": "Robert", "Nom": "Lepingre", "Email": "bobby@exemple.com", "Age": 41, "Ville": "Paris"}

  2. [{"Prenom": "Robert", "Nom": "Lepingre", "Email": "bobby@exemple.com", "Age": 41, "Ville": "Paris"},{"Prenom": "Jeanne", "Nom": "Ducoux", "Email": "jeanne@exemple.com", "Age": 32, "Ville": "Marseille"},{"Prenom": "Pierre", "Nom": "Lenfant", "Email": "pierre@exemple.com", "Age": 23, "Ville": "Rennes"} ]

Méthode1. Sauvegarder un objet de type Personne dans un fichier

Idée : utiliser le type dictionnaire qui permet de définir une collection d'éléments prenant la forme « étiquette : valeur ». Nous exploitons cela pour sauver les champs de l'objet.

1
#import module Perso
2
import ModulePersonne as MP
3
4
#import module json
5
import json
6
7
#saisie personne
8
p = MP.Personne()
9
p.saisie()
10
11
#sauvegarde
12
f = open("personne.json","w")
13
14
#dictionnaire
15
d = {"Prenom":p.prenom,"Nom":p.nom,"Email":p.email,"Age":p.age,"Ville":p.ville}
16
17
#sauver au format json
18
json.dump(d,f)
19
20
#fermer le fichier
21
f.close();

- Noter l'importation du module json ;

- Une étape clé est la transformation de l'objet référencé par \(p\) en un dictionnaire référencé par \(d\) ;

- La méthode dump() de la classe json permet de stocker l'objet dictionnaire dans le fichier référencé par \(f\) ;

- Il ne faut pas oublier d'ouvrir en écriture puis de fermer le fichier ;

- Noter le format de fichier json avec les accolades { } pour délimiter un enregistrement : {"Prenom": "Robert", "Nom": "Lepingre", "Email": "bobby@exemple.com", "Age": 41, "Ville": "Paris"}

SimulationÀ faire vous-même

1) Si ce n'est déjà fait, téléchargez le fichier Python ci-dessous et stockez le dans le même répertoire que votre futur programme Python nécessaire à la question 2).

2) Utilisez la méthode précédente pour obtenir le premier enregistrement du tableau de données au format JSON.

{"Prenom": "Robert", "Nom": "Lepingre", "Email": "bobby@exemple.com", "Age": 41, "Ville": "Paris"}

Astuce  tous les objets Python possède l'attribut standard __dict__, il recense les champs de la classe et leurs valeurs pour l'objet. Il est de type dictionnaire.

C'est exactement ce qu'il nous faut pour simplifier grandement le code proposé dans la méthode ci-dessus.

1
#import module Perso
2
import ModulePersonne as MP
3
4
#import module json
5
import json
6
7
#saisie personne
8
p = MP.Personne()
9
p.saisie()
10
11
#sauvegarde
12
f = open("personne.json","w")
13
14
#sauver au format json
15
json.dump(p.__dict__,f) #!!!
16
17
#fermer le fichier
18
f.close();

ComplémentLecture du fichier - Charger l'objet via le type dictionnaire

Dans le listing suivant :

- Le fichier est maintenant ouvert en lecture ;

- La méthode load() de la classe json s'occupe du chargement, l'objet chargé est de type dict (dictionnaire) ;

- Nous créons une instance de Personne, et nous recopions les informations ;

- L'objet référencé par \(p\) peut vivre sa vie par la suite, ici utilisation de la méthode affichage().

1
#import module Perso
2
import ModulePersonne as MP
3
4
#import module json
5
import json
6
7
#ouverture fichier
8
f = open("personne.json","r")
9
10
#chargement
11
d = json.load(f)
12
print(d)
13
print(type(d))
14
15
#transf. en Personne
16
p = MP.Personne()
17
p.prenom = d["Prenom"]
18
p.nom = d["Nom"]
19
p.email = d["Email"]
20
p.age = d["Age"]
21
p.ville= d["Ville"]
22
23
#affichage
24
p.affichage()
25
26
#fermeture
27
f.close();

Méthode2. Sauvegarder une collection (liste) de personnes

Objectif : Sauvegarder un ensemble de personnes dans un fichier JSON.

Idée : Utiliser une double collection : une liste (list) dans laquelle sont insérés des dictionnaires (dict).

1
#import module Perso
2
import ModulePersonne as MP
3
4
#import module json
5
import json
6
7
#liste vide
8
liste = []
9
10
#nb. de pers ?
11
n = int(input("Nb de pers : "))
12
13
#saisie liste
14
for i in range(0,n):
15
    a = MP.Personne()
16
    a.saisie()
17
    liste.append(a)
18
    
19
#sauvegarde
20
f = open("personnes.json","w")
21
22
#creer une liste temporaire
23
tmp = []
24
25
#pour chaque personne
26
for p in liste:
27
    #creer un dictionnaire
28
    d = {}
29
    d["Prenom"] = p.prenom
30
    d["Nom"] = p.nom
31
    d["Email"] = p.email
32
    d["Age"] = p.age
33
    d["Ville"] = p.ville
34
    #ajouter dans liste tmp
35
    tmp.append(d)
36
37
#sauvegarde de la liste tmp
38
json.dump(tmp,f)
39
40
#fermer le fichier
41
f.close();

- format JSON : noter l'imbrication des [ ] et { } pour délimiter la liste et chaque enregistrement ;

- effectuer un dump() sur la liste principale \(tmp\) revient à sauver chaque dictionnaire (Personne) qui le compose.

SimulationÀ faire vous-même

Utilisez la méthode précédente pour obtenir l'enregistrement complet du tableau de données au format JSON.

[{"Prenom": "Robert", "Nom": "Lepingre", "Email": "bobby@exemple.com", "Age": 41, "Ville": "Paris"}, {"Prenom": "Jeanne", "Nom": "Ducoux", "Email": "jeanne@exemple.com", "Age": 32, "Ville": "Marseille"}, {"Prenom": "Pierre", "Nom": "Lenfant", "Email": "pierre@exemple.com", "Age": 23, "Ville": "Rennes"}]

ComplémentLecture du fichier - Charger une liste d'objets

Dans le listing suivant :

- Effectuer un load() permet de charger la liste de dictionnaires, référencée par\( tmp\).

- Une instance de Personne est créée pour chaque élément de type dict et les informations sont recopiées.

1
#import module Perso
2
import ModulePersonne as MP
3
4
#import module json
5
import json
6
7
#ouverture fichier
8
f = open("personnes.json","r")
9
10
#chargement
11
tmp = json.load(f)
12
13
#conv. en liste de personnes
14
liste = []
15
16
for d in tmp:
17
    #creer une personne
18
    p = MP.Personne()
19
    p.prenom = d["Prenom"]
20
    p.nom = d["Nom"]
21
    p.email = d["Email"]
22
    p.age = d["Age"]
23
    p.ville= d["Ville"]
24
    #affichage
25
    p.affichage()
26
    #l'ajouter dans la liste
27
    liste.append(p)
28
29
print("Nb personnes : ",len(liste))
30
#fermeture
31
f.close();