Le format JSON
Le format JSON
Commençons avec ce fichier (csv) ouvert avec un éditeur de texte :
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
Justine,Ptitegoutte,justine@totoche.com,10,Draguignan
Gerard,Manfain,gerard@exemple.com,15,Nice
Agathe,Zeublouse,agathe@exemple.com,18,Toulon
Ahmed,Epan,ahmed@totoche.com,19,Cannes
Il existe de nombreux site qui propose une conversion au format Json de fichiers csv :
Allons sur celui-là : CSV to JSON
Copiez et collez les lignes précédentes dans la partie gauche
Sélectionnez Hash
Et lancez la conversion
On obtient un fichier json dont les données sont encapsulées dans des accolades { } , ce sera un dictionnaire....
Réitérez l'opération, mais en sélectionnant Array
Enregistrez le fichier obtenu sous le nom : exemple_array.json
Les données sont cette fois-ci encapsulées dans des crochets : [ ] , ce sera une liste....
Simulation : Manipulations de bases
Dans Processing, glissez déposez le fichier : exemple.json
Celui-ci se trouve dans le dossier 'data' du sketch
On charge ce fichier , en utilisant la librairie 'json' de Python
import json
with open('data/exemple.json') as json_data:
exemple_dict=json.load(json_data)
exemple_dict est du type dictionnaire , car les données sont encapsulées dans des accolades...
Ce dictionnaire contient des dictionnaires, car ....
import json
with open('data/exemple.json') as json_data:
exemple_dict=json.load(json_data)
print(type(exemple_dict))
Faisons afficher les clés :
import json
with open('data/exemple.json') as json_data:
exemple_dict=json.load(json_data)
print(type(exemple_dict))
print(exemple_dict.keys())
En sortie :
<type 'dict'>
[u'Ahmed', u'Pierre', u'Justine', u'Agathe', u'Gerard', u'Robert', u'Jeanne']
Ce dictionnaire est composés de dictionnaires...
Faisons afficher les sous-clés à l'une des clés :
import json
with open('data/exemple.json') as json_data:
exemple_dict=json.load(json_data)
print(type(exemple_dict))
print(exemple_dict.keys())
print(exemple_dict['Ahmed'].keys())
En sortie :
<type 'dict'>
[u'Ahmed', u'Pierre', u'Justine', u'Agathe', u'Gerard', u'Robert', u'Jeanne']
[u'Email', u'Nom', u'Age', u'Ville']
Faisons afficher une valeur en particulier :
import json
with open('data/exemple.json') as json_data:
exemple_dict=json.load(json_data)
print(type(exemple_dict))
print(exemple_dict.keys())
print(exemple_dict['Ahmed'].keys())
print(exemple_dict['Ahmed']['Nom'])
En sortie :
<type 'dict'>
[u'Ahmed', u'Pierre', u'Justine', u'Agathe', u'Gerard', u'Robert', u'Jeanne']
[u'Email', u'Nom', u'Age', u'Ville']
Epan
Faites afficher les valeurs concernant Ahmed Epan
Simulation : Exercice
Retrouver les valeurs concernant Ahmed Epan , avec le fichier : exemple_array.json
Attention, cette liste contient des dictionnaires
Pour rappel :
Pour accéder à un élément de la liste, on utilise son index :
maliste[index]
Pour accéder à un élément d'un dictionnaire, on utilise une clé :
maliste[index]['la-clé']
import json
with open('data/exemple_array.json') as json_data:
exemple_array=json.load(json_data)
print(type(exemple_array))
# a compléter
import json
with open('data/exemple_array.json') as json_data:
exemple_array=json.load(json_data)
print(type(exemple_array))
print(exemple_array[6])
print(exemple_array[6].keys())
print(exemple_array[6]['Nom'])
print(exemple_array[6]['Prenom'])
print(exemple_array[6]['Email'])
print(exemple_array[6]['Ville'])
print(exemple_array[6]['Age'])
Utiliser des données Json en ligne
Utilisation d'un fichier Json en ligne
Le site openweathermap donne l'accès à des données météo, moyennant l'obtention d'une clé API
Pour la suite il est préférable que vous obteniez votre propre clé API, cependant en voilà une créée pour les besoins de cet apprentissage
clé API (à n'utiliser que si vous n'avez pas encore la votre...): 8a96de29db2220174ce8e07bcc98f95d
Copiez et collez cette URL dans votre navigateur
http://api.openweathermap.org/data/2.5/weather?q=draguignan,fr&lang=fr&mode=json&APPID=8a96de29db2220174ce8e07bcc98f95d
Cela nous donne accès à un fichier Json, qui offre des données météo sur la ville de Draguignan en France...
Essayez avec une autre ville...
Simulation : Un programme (Processing)
Nous allons écrire un programme qui affiche certaines de ces données
Observons dans un premier temps, la structure de ce fichier
{
"coord":{"lon":6.46,"lat":43.54},
"weather":[{"id":800,"main":"Clear","description":"ciel dégagé","icon":"01d"}],
"base":"stations",
"main":{"temp":284.7,"pressure":1005,"humidity":29,"temp_min":284.15,"temp_max":285.15},
"visibility":10000,
"wind":{"speed":11.3,"deg":320,"gust":16.5},
"clouds":{"all":0},
"dt":1547040600,
"sys":{"type":1,"id":6506,"message":0.2104,"country":"FR","sunrise":1547017590,"sunset":1547050593},
"id":3020850,
"name":"Draguignan",
"cod":200
}
Les données sont encapsulées dans des accolades {...}, ce qui nous donnera un dictionnaire une fois chargées.
De plus la clé "weather" est une liste [...] qui contient un seul élément : un dictionnaire.
Nous aurons besoin des bibliothèques :
json, pour traiter les fichiers json
urllib, pour traiter les URL
Ci-dessous le programme : commenté
Encore une fois : c'est mieux si vous utilisez votre propre clé API...
"""
Import de données json depuis openweathermap.
les données sont sous la forme d'un dictionnaire, contenant des dictionnaires et une liste
On charge ces dictionnaires dans des variables, pour accéder aux éléments
On fait afficher le tout dans une fenêtre
"""
# import des bibliothèques
import urllib
import json
# fonction pour remplacer la fonction input() de Python qui n'existe pas dans Processing
def input(message=''):
from javax.swing import JOptionPane
return JOptionPane.showInputDialog(frame,message)
# fonction pour l'action de la souris sur la zone recherche, cette action lance une boite de dialogue
def mouseClicked():
global ville
if mouseX>320 and mouseX<width and mouseY>270 and mouseY<height:
mot=input('Entrez un nom de ville')#appel de la boite de dialogue
if mot:
ville=mot.upper()
application(ville)#appel de la fonction application avec le paramètre ville
def setup():
size(500,300)
background(0)
global ville,url_param,reponse,reponsedict,temps,temperature,temp_degree,temp_max,temp_min,pression,humidite,icone,description,img,API_key
ville='DRAGUIGNAN'
API_key='8a96de29db2220174ce8e07bcc98f95d'
application(ville)#1er appel de la fonction application
#############################
# cette fonction charge le fichier json obtenu avec l'url dans la variable reponse
# puis si tout se passe bien, on charge la reponse dans le dictionnaire reponse_dict ( grace à la bibliothèque json)
# puis on charge dans la variable temps, les valeurs de la clé 'weather'
# enfin on récupère les valeurs des clés 'icon' et 'description' dans les variables icone et description
# on charge ensuite l'image de l'icone dans la variable img
# en cas d'erreur, on affiche la raison de l'erreur dans la console, pour cela on récupère le message
# donné par le fichier json: c'est la valeur de la clé 'message'
##############################
def application(ville):
global url_param,reponse,reponsedict,temps,icone,description,img,API_key
url_param="http://api.openweathermap.org/data/2.5/weather?q="+ville+",fr&lang=fr&mode=json&APPID="+API_key
reponse=urllib.urlopen(url_param).read()
try:
reponsedict=json.loads(reponse)
temps=reponsedict['weather']
icone=temps[0]['icon'] # on récupère la valeur de la clé 'icon' se trouvant à l'index 0 de la liste
description=temps[0]['description']
img=loadImage("http://openweathermap.org/img/w/"+icone+".png")
except:
erreur=reponsedict['message']
print("sans doute une erreur")
print(erreur)
# affichage dans la fenêtre:
# l'image
# la ville
# la description du temps
# la zone de recherche (cliquable)
def draw():
background(0)
image(img,350,50,100,100)
textSize(20)
text(ville,50,30)
text("Temps : " +description,50,100)
fill(255)
rect(420,270,80,30,10)
fill(0)
textSize(10)
text("Rechercher",425,290)
fill(255)
Le travail à réaliser : (Processing)
Faire en sorte que le programme affiche, la température, les températures max et min, la pression et le taux d'humidité
Il faut faire attention aux unités et les convertir si nécessaire.
Pour charger un nombre, il faut obliger Python a lire l'élément comme un nombre, par exemple : temp=float(temperature['temp'])
l'instruction float(élément)
, oblige la lecture en tant que float.
Pour faire afficher dans la fenêtre du texte et le contenu d'une variable, on utilise l'instruction , par exemple : text(unicode('Température : ',"utf-8")+str(temp_degree),50,130)
text(....,50,130)
, texte à afficher aux coordonnées (50,130)
unicode(....)
pour faire afficher le texte accentué
str(....)
pour obliger le contenu à être lu comme un string
pour séparer le texte de la variable+
Le corrigé
"""
Import de données json depuis openweathermap.
les données sont sous la forme d'un dictionnaire, contenant des dictionnaires et une liste
On charge ces dictionnaires dans des variables, pour accéder aux éléments
On fait afficher le tout dans une fenêtre
"""
import urllib
import json
# fonction pour remplacer la fonction input() de Python qui n'existe pas dans processing
def input(message=''):
from javax.swing import JOptionPane
return JOptionPane.showInputDialog(frame,message)
# fonction pour l'action de la souris sur la zone recherche
def mouseClicked():
global ville
if mouseX>320 and mouseX<width and mouseY>270 and mouseY<height:
mot=input('Entrez un nom de ville')#appel de la boite de dialogue
if mot:
ville=mot.upper()
application(ville)
def setup():
size(500,300)
background(0)
global ville,url_param,reponse,reponsedict,temps,temperature,temp_degree,temp_max,temp_min,pression,humidite,icone,description,img,API_key
ville='DRAGUIGNAN'
API_key='8a96de29db2220174ce8e07bcc98f95d'
application(ville)
def application(ville):
global url_param,reponse,reponsedict,temps,temperature,temp_degree,temp_max,temp_min,pression,humidite,icone,description,img,API_key
url_param="http://api.openweathermap.org/data/2.5/weather?q="+ville+",fr&lang=fr&mode=json&APPID="+API_key
reponse=urllib.urlopen(url_param).read()
print(reponse)
try:
reponsedict=json.loads(reponse)
temps=reponsedict['weather']
temperature=reponsedict['main']
#print(temperature)
temp_degree=(float(temperature['temp'])-273)
temp_max=(float(temperature['temp_max'])-273)
temp_min=(float(temperature['temp_min'])-273)
pression=temperature['pressure']
humidite=temperature['humidity']
#print(temp_degree)
#print(temps)
icone=temps[0]['icon']
description=temps[0]['description']
img=loadImage("http://openweathermap.org/img/w/"+icone+".png")
except:
erreur=reponsedict['message']
print("sans doute une erreur")
print(erreur)
def draw():
#global ville,url_param,reponse,reponsedict,temps,temperature,temp_degree,temp_max,temp_min,pression,humidite,icone,description,img,API_key
background(0)
image(img,350,50,100,100)
textSize(20)
text(ville,50,30)
text("Temps : " +description,50,100)
text(unicode('Température : ',"utf-8")+str(temp_degree),50,130)
text(unicode("Température max : ","utf-8")+str(temp_max),50,160)
text(unicode("Température min : ","utf-8")+str(temp_min),50,190)
text("Pression : "+str(pression),50,220)
text(unicode("Humidité : ","utf-8")+str(humidite),50,250)
fill(255)
rect(420,270,80,30,10)
fill(0)
textSize(10)
text("Rechercher",425,290)
fill(255)
Simulation : Une idée de projet...
Le site openfoodfacts.org, propose des données sur des produits alimentaires.
Ce site est alimenté par des consommateurs bénévoles
On peut avoir accès aux données (json) d'un produit si on connaît son code...
Par exemple essayez cette URL : https://fr.openfoodfacts.org/api/v0/produit/3270160860166.json dans votre navigateur
3270160860166 est le code de ce produit
Comme vous pouvez le constater il y a énormément de données....
En voici deux pour démarrer : (Processing)
Une image du produit
La masse de sucre pour 100g de produit
Le programme suivant affiche l'image et le taux de sucre
import urllib
import json
#url_param="https://fr.openfoodfacts.org/api/v0/produit/3029330003533.json"
#url_param="https://fr.openfoodfacts.org/api/v0/produit/00036559.json"
url_param="https://fr.openfoodfacts.org/api/v0/produit/3270160860166.json"
size(300,200)
reponse=urllib.urlopen(url_param).read()
reponsedict=json.loads(reponse)
dict1=reponsedict['product']
test=dict1['nutriments']
teneur=float(test['sugars_100g'])
img_url=dict1['image_small_url']
img=loadImage(img_url)
image(img,10,10)
print("la teneur en sucre de ce produit est de :"+str(teneur)+"g pour 100g")
On peut imaginer :
Un fichier texte contenant une liste de code de produit
En choisir un et faire afficher des données concernant ce produit
Imaginer un "jeu", ou on demande d'estimer le nombre de morceaux de sucre (ou de pincées de sel) que contient un produit...
Faire afficher la liste des ingrédients....