Un JSON et après ?
Le
ffred13

Bonjour
Je suis en plein apprentissage du python, je rencontre quelques difficult=
és pourriez vous m'aider SVP
J'essaie de récupérer à partir de google api la distance en 2 villes
import urllib, json
import pprint
URL2 = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=
=Paris&destinations=Marseille&mode=driving&language=fr-FR&sensor==
false"
googleResponse = urllib.urlopen(URL2)
jsonResponse = json.loads(googleResponse.read())
# pour le débug
pprint.pprint(jsonResponse)
Je reçois ce type de réponse
{u'destination_addresses': [u'Marseille, France'],
u'origin_addresses': [u'Paris, France'],
u'rows': [{u'elements': [{u'distance': {u'text': u'774 km',
u'value': 774475},
u'duration': {u'text': u'6 heures 47 minutes',
u'value': 24438},
u'status': u'OK'}]}],
u'status': u'OK'}
2 questions :
- Pourquoi j'ai des u partout ?
- J'ai besoin de récupérer les données distance-value et duration-val=
ue, comment le faire simplement ?
Je vous remercie
Bonne journée
ffred13
Je suis en plein apprentissage du python, je rencontre quelques difficult=
és pourriez vous m'aider SVP
J'essaie de récupérer à partir de google api la distance en 2 villes
import urllib, json
import pprint
URL2 = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=
=Paris&destinations=Marseille&mode=driving&language=fr-FR&sensor==
false"
googleResponse = urllib.urlopen(URL2)
jsonResponse = json.loads(googleResponse.read())
# pour le débug
pprint.pprint(jsonResponse)
Je reçois ce type de réponse
{u'destination_addresses': [u'Marseille, France'],
u'origin_addresses': [u'Paris, France'],
u'rows': [{u'elements': [{u'distance': {u'text': u'774 km',
u'value': 774475},
u'duration': {u'text': u'6 heures 47 minutes',
u'value': 24438},
u'status': u'OK'}]}],
u'status': u'OK'}
2 questions :
- Pourquoi j'ai des u partout ?
- J'ai besoin de récupérer les données distance-value et duration-val=
ue, comment le faire simplement ?
Je vous remercie
Bonne journée
ffred13
Bonjour,
Ca indique que les chaînes de caractères qui suivent sont en unicode. Il
faudrait trouver un pointeur vers le bon endroit de la documentation
python.
C'est d'autant plus important à connaître que ça correspond à une
différence majeure python 2/ python 3
Ce qui suit marche (ce serait bien qu'il existe plus élégant):
duration = jsonResponse['rows'][0].values()[0][0]['duration']['value']
distance = jsonResponse['rows'][0].values()[0][0]['distance']['value']
print duration
print distance
@+
--
Yves
Parce que ce sont des chaînes de caratères Unicode.
jsonResponse[u'distance'][u'value']
ffred13, 2013-05-15 08:32+0200:
--
. o .
. . o Tanguy
o o o
unicode. Vous pouvez pour l'instant l'admettre.
L'expression que vous obtenez en réponse n'est pas simple, elle est
donc intéressante en phase d'apprentissage. Il vous faut avoir à portée
la documentation de base sur les dictionnaires et les listes. Ensuite,
vous détricotez l'expression. Vous pouvez vous aider de votre éditeur
de code. Il ne formatera certainement pas l'expression comme vous le
souhaitez, en revanche il peut être très utile en montrant les couples
de crochets, parenthèses et autre accolades. Mis en forme ça pourrait
ressembler à:
x = {u'destination_addresses': [u'Marseille, France'
],
u'origin_addresses' : [u'Paris, France'
],
u'rows' : [{u'elements': [{u'distance': {u'text' :
u'774 km',
u'value':
774475
},
u'duration': {u'text' :
u'6 heures 47 minutes',
u'value':
24438
},
u'status' : u'OK'
}
]
}
],
u'status' : u'OK'
}
Vous pouvez isoler x['rowx'] (ou x['rowx'][0]).
Vous allez remarquer un truc un peu troublant, c'est l'utilisation de
listes singleton (à un seul élément) là où semble-t-il l'élément aurait
suffi. Admettez-le pour l'instant, les raisons en sont sans doute dans
la tripaille, le passage de paramètres, le fait que ce résultat a à
faire avec un autre langage, ou au moins su code non Python. Si vous
avez pratiqué d'autres langages, entendu parler de passage par (copie
de) valeur, adresse, référence, ceci vous dira peut-être quelque chose:
def f1(liste):
liste[0] = 0
def f2(valeur):
valeur = 0
a = 10
b = [10]
print 'avant: %d' % a
f2(a)
print u'après: %d' % a
print 'avant: %d' % b[0]
f1(b)
print 'après: %d' % b[0]
Ensuite, vous verrez que récupérer les données distance-value et
duration-value n'est pas sorcier. Même si l'expression est un peu
velue. A ce moment-là, vous la cachez dans une fonction
getDistance-value(lastructure), votre coeur de code sera plus
sympathique à lire.
--
Pierre Maurette