Error de Python carga el código JSON de la API de Google

Estoy usando la API de geoencoding de Google para probar el siguiente código de Python usando Python 3.5. Pero recibe el error de abajo. El código se copia del código de muestra de Coursera. Suponemos que podemos probar cualquier ubicación. Por ejemplo: Ann Arbor, MI

Cualquier idea acerca de por qué tengo el error al cargar el código JSON:

elevar JSONDecodeError (“Esperando valor”, s, err.value) desde Ninguno> JSONDecodeError: Esperando valor

Aquí están los códigos:

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)) 

Por lo tanto, tuve que modificar su código para ejecutar. Estoy usando Python 3.4.3 en Ubuntu 14.04.

 #import urllib import urllib.parse import urllib.request 

Recibí un error similar:

 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  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) 

Básicamente, en lugar de intentar descodificar la cadena json válida, estamos tratando de descodificar el valor ‘Ninguno’ de Python, que no es json válido. Intente aplicar parches en el siguiente código de ejemplo. Ejecútelo primero una vez para verificar que el objeto json más simple ‘{}’ funcione. Luego, intente cada uno de los diferentes ‘possible_json_string’ uno por uno.

 #... 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) 

Fuente

El error surge porque los “datos” son de tipo bytes, por lo que tiene que decodificarlos en una cadena antes de usar json.loads para convertirlo en un objeto json. Así que para resolver el problema:

 uh = urllib.request.urlopen(url) data = uh.read() print ('Retrieved',len(data),'characters') js = json.loads(data.decode("utf-8")) 

Además, str (datos) en el código que compartes funcionará en Python 2.x pero no en Python 3.x porque str () no convierte los bytes en una cadena en 3.x.