1. ホーム
  2. スクリプト・コラム
  3. パイソン

[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件

2022-01-11 19:42:53

質問

以下のようなコードです。

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

Python3.5でgoogle geocode APIを使用するとエラーが発生します。 

raise JSONDecodeError("Expecting value", s, err.value) from None >JSONDecodeError: Expecting value

解決方法は?

そこで、あなたのコードを修正し、実行する必要がありました。私はUbuntu 14.04でPython 3.4.3を使っています。

#import urllib  
import urllib.parse
import urllib.request

同様のエラーが発生しました。

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)

基本的に、有効なjson文字列をデコードしようとするのではなく、有効なjsonではないPythonの「None」値をデコードしようとしているのです。以下のサンプルコードにパッチを当ててみてください。最初に一度だけ実行し、最も単純な json オブジェクト '{}' が動作することを再確認してください。次に、異なる 'possible_json_string' を一つずつ試してみてください。

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

ソース