问题
I am using google geocode API to test the following Python code using Python 3.5. But receive the error below. The code is copied from sample code of Coursera. We suppose to be able to test any locations. For example: Ann Arbor, MI
Any idea about why I have the error when load JSON code:
raise JSONDecodeError("Expecting value", s, err.value) from None >JSONDecodeError: Expecting value
here are the 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))
回答1:
So, I had to modify your code to run. I am using Python 3.4.3 on Ubuntu 14.04.
#import urllib
import urllib.parse
import urllib.request
I received a similar error:
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)
Basically, instead of trying to decode the valid json string, we're trying to decode the Python 'None' value, which is not valid json. Try patching in the following example code. Run it first once to double-check that the simplest json object '{}' will work. Then, try each different 'possible_json_string' one by one.
#...
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)
Source
回答2:
The error arises because the "data" is of type bytes so you have to decode it into a string before using json.loads
to turn it into a json object. So to solve the problem:
uh = urllib.request.urlopen(url)
data = uh.read()
print ('Retrieved',len(data),'characters')
js = json.loads(data.decode("utf-8"))
Also, str(data) in the code you share will work in Python 2.x but not in Python 3.x because str() doesn't turn bytes into a string in 3.x.
来源:https://stackoverflow.com/questions/34573197/python-error-load-json-code-of-google-api