J'utilise l'API Google Geocode pour tester le code Python en utilisant Python 3.5. Mais recevez l'erreur ci-dessous. Le code est copié à partir d'un exemple de code de Coursera). Nous supposons être en mesure de tester n'importe quel emplacement. Par exemple: Ann Arbor, MI
Toute idée de la raison pour laquelle j'ai l'erreur lors du chargement du code JSON:
lever JSONDecodeError ("Valeur attendue", s, valeur err.) à partir de Aucun> JSONDecodeError: Valeur attendue
voici les codes:
import urllib
import json
serviceurl = 'http://maps.googleapis.com/maps/api/geocode/json?'
while True:
address = input('Enter location: ')
if len(address) < 1 : break
url = serviceurl + urllib.parse.urlencode({'sensor':'false',
'address': address})
print ('Retrieving', url)
uh = urllib.request.urlopen(url)
data = uh.read()
print ('Retrieved',len(data),'characters')
js = json.loads(str(data))
J'ai donc dû modifier votre code pour l'exécuter. J'utilise Python 3.4.3 sur Ubuntu 14.04.
#import urllib
import urllib.parse
import urllib.request
J'ai reçu une erreur similaire:
heyandy889@laptop:~/src/test$ python3 help.py
Enter location: MI
Retrieving http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=MI
Retrieved 1405 characters
Traceback (most recent call last):
File "help.py", line 18, in <module>
js = json.loads(str(data))
File "/usr/lib/python3.4/json/__init__.py", line 318, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.4/json/decoder.py", line 343, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.4/json/decoder.py", line 361, in raw_decode
raise ValueError(errmsg("Expecting value", s, err.value)) from None
ValueError: Expecting value: line 1 column 1 (char 0)
Fondamentalement, au lieu d'essayer de décoder la chaîne json valide, nous essayons de décoder la valeur Python 'None', qui n'est pas json valide. Essayez de corriger dans l'exemple de code suivant. Exécutez-le une première fois pour vérifier que l'objet json le plus simple '{}' fonctionnera, puis essayez chaque 'possible_json_string' un par un.
#...
print ('Retrieved',len(data),'characters')
#possible_json_string = str(data) #original error
possible_json_string = '{}' #sanity check with simplest json
#possible_json_string = data #why convert to string at all?
#possible_json_string = data.decode('utf-8') #intentional conversion
print('possible_json_string')
print(possible_json_string)
js = json.loads(possible_json_string)
L'erreur se produit car les "données" sont de type octets, vous devez donc les décoder en chaîne avant d'utiliser json.loads
pour le transformer en objet json. Donc, pour résoudre le problème:
uh = urllib.request.urlopen(url)
data = uh.read()
print ('Retrieved',len(data),'characters')
js = json.loads(data.decode("utf-8"))
De plus, str (données) dans le code que vous partagez fonctionnera dans Python 2.x mais pas dans Python 3.x parce que str () ne fonctionne pas transformer les octets en une chaîne en 3.x.
Regardez l'erreur:
"lever JSONDecodeError (" Valeur attendue ", s, valeur err.) à partir de None
JSONDecodeError: Valeur attendue "
C'est dire que j'ai obtenu un None quand j'étais censé obtenir quelque chose.
Vérifiez votre variable de données pour None avant d'appeler la fonction json.loads()
.
if data == None or data == '':
print('I got a null or empty string value for data in a file')
else:
js = json.loads(str(data))