Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Un JSON et après ?

3 réponses
Avatar
ffred13
Bonjour

Je suis en plein apprentissage du python, je rencontre quelques difficult=
=E9s pourriez vous m'aider SVP

J'essaie de r=E9cup=E9rer =E0 partir de google api la distance en 2 villes

import urllib, json
import pprint

URL2 =3D "http://maps.googleapis.com/maps/api/distancematrix/json?origins=
=3DParis&destinations=3DMarseille&mode=3Ddriving&language=3Dfr-FR&sensor=3D=
false"

googleResponse =3D urllib.urlopen(URL2)
jsonResponse =3D json.loads(googleResponse.read())

# pour le d=E9bug
pprint.pprint(jsonResponse)


Je re=E7ois ce type de r=E9ponse=20

{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=E9cup=E9rer les donn=E9es distance-value et duration-val=
ue, comment le faire simplement ?

Je vous remercie

Bonne journ=E9e

ffred13

3 réponses

Avatar
yves
Le Tue, 14 May 2013 23:32:34 -0700, ffred13 a écrit:

Bonjour,

- Pourquoi j'ai des u partout ?



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

- J'ai besoin de récupérer les données distance-value et duration-value,
comment le faire simplement ?



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
Avatar
Tanguy Ortolo
ffred13, 2013-05-15 08:32+0200:
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 ?



Parce que ce sont des chaînes de caratères Unicode.

- J'ai besoin de récupérer les données distance-value et duration-value, comment le faire simplement ?



jsonResponse[u'distance'][u'value']
ffred13, 2013-05-15 08:32+0200:

--
. o .
. . o Tanguy
o o o
Avatar
Pierre Maurette
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úlse"

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 ?



unicode. Vous pouvez pour l'instant l'admettre.

- J'ai besoin de récupérer les données distance-value et duration-value,
comment le faire simplement ?



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