Format JSON
Rappel : Format 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.
Syntaxe : Difficultés
Les données en tableau :
Prenom | Nom | 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 :
Comment sauvegarder un objet de type Personne dans un fichier ?
Comment sauvegarder une collection (liste) de personnes ?
Idée : on peut utiliser le type dictionnaire, on obtiendra respectivement :
{"Prenom": "Robert", "Nom": "Lepingre", "Email": "bobby@exemple.com", "Age": 41, "Ville": "Paris"}
[{"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éthode : 1. 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.
#import module Perso
import ModulePersonne as MP
#import module json
import json
#saisie personne
p = MP.Personne()
p.saisie()
#sauvegarde
f = open("personne.json","w")
#dictionnaire
d = {"Prenom":p.prenom,"Nom":p.nom,"Email":p.email,"Age":p.age,"Ville":p.ville}
#sauver au format json
json.dump(d,f)
#fermer le fichier
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.
#import module Perso
import ModulePersonne as MP
#import module json
import json
#saisie personne
p = MP.Personne()
p.saisie()
#sauvegarde
f = open("personne.json","w")
#sauver au format json
json.dump(p.__dict__,f) #!!!
#fermer le fichier
f.close();
Complément : Lecture 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().
#import module Perso
import ModulePersonne as MP
#import module json
import json
#ouverture fichier
f = open("personne.json","r")
#chargement
d = json.load(f)
print(d)
print(type(d))
#transf. en Personne
p = MP.Personne()
p.prenom = d["Prenom"]
p.nom = d["Nom"]
p.email = d["Email"]
p.age = d["Age"]
p.ville= d["Ville"]
#affichage
p.affichage()
#fermeture
f.close();
Méthode : 2. 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).
#import module Perso
import ModulePersonne as MP
#import module json
import json
#liste vide
liste = []
#nb. de pers ?
n = int(input("Nb de pers : "))
#saisie liste
for i in range(0,n):
a = MP.Personne()
a.saisie()
liste.append(a)
#sauvegarde
f = open("personnes.json","w")
#creer une liste temporaire
tmp = []
#pour chaque personne
for p in liste:
#creer un dictionnaire
d = {}
d["Prenom"] = p.prenom
d["Nom"] = p.nom
d["Email"] = p.email
d["Age"] = p.age
d["Ville"] = p.ville
#ajouter dans liste tmp
tmp.append(d)
#sauvegarde de la liste tmp
json.dump(tmp,f)
#fermer le fichier
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ément : Lecture du fichier - Charger une liste d'objets
#import module Perso
import ModulePersonne as MP
#import module json
import json
#ouverture fichier
f = open("personnes.json","r")
#chargement
tmp = json.load(f)
#conv. en liste de personnes
liste = []
for d in tmp:
#creer une personne
p = MP.Personne()
p.prenom = d["Prenom"]
p.nom = d["Nom"]
p.email = d["Email"]
p.age = d["Age"]
p.ville= d["Ville"]
#affichage
p.affichage()
#l'ajouter dans la liste
liste.append(p)
print("Nb personnes : ",len(liste))
#fermeture
f.close();