私は次のPythonコードusing Python 3.5。任意の場所をテストできると仮定します(例:Ann Arbor、MI)
JSONコードを読み込むときにエラーが発生する理由についてのアイデア:
noneからJSONDecodeError( "Expecting value"、s、err.value)を発生させます> JSONDecodeError:期待値
ここにコードがあります:
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))
したがって、実行するためにコードを変更する必要がありました。 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文字列をデコードする代わりに、Python 'None'値をデコードしようとしています。これは有効なjsonではありません。次のサンプルコードでパッチを適用してみてください。実行してください。最初に、最も単純なjsonオブジェクト '{}'が機能することを再確認し、次に、各 'possible_json_string'を1つずつ試します。
#...
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)
「データ」のタイプがバイトであるため、エラーが発生します。json.loads
を使用してjsonオブジェクトに変換する前に、データを文字列にデコードする必要があります。したがって、問題を解決するには:
uh = urllib.request.urlopen(url)
data = uh.read()
print ('Retrieved',len(data),'characters')
js = json.loads(data.decode("utf-8"))
また、共有するコードのstr(data)はPython 2.xでは機能しますが、Python 3.xでは機能しません。str()は機能しないためです。 3.xでバイトを文字列に変換します。
エラーを見てください:
Noneから「raise JSONDecodeError( "Expecting value"、s、err.value)」
JSONDecodeError:期待値
それは私が何かを手に入れることになっていたときに私がNoneを得たと言っています。
json.loads()
を呼び出す前に、Noneのデータ変数を確認してください。
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))