Python で Raise JSONDecodeError(Expected Value, S, err.value) From None を解決する
Python で URL と API を操作する場合、多くの場合、urllib
および json
ライブラリを使用する必要があります。 さらに重要なことに、json
ライブラリは、特に API を使用してデータを転送するデフォルトの方法である JSON データの処理に役立ちます。
json
ライブラリ内には、JSONDecodeError
エラーを返すメソッド loads()
があります。 この記事では、このようなエラーを解決し、適切に対処する方法について説明します。
try
を使用して Python で raise JSONDecodeError("Expecting value", s, err.value) from None
を解決する
JSON を扱う前は、しばしば urllib
パッケージを介してデータを受け取る必要がありました。 ただし、urllib パッケージ を使用する場合は、エラーが発生する可能性があるため、そのようなパッケージをコードにインポートする方法を理解することが重要です。
urllib
パッケージを利用するには、それをインポートする必要があります。 多くの場合、以下のようにインポートすることがあります。
import urllib
queryString = {"name": "Jhon", "age": "18"}
urllib.parse.urlencode(queryString)
上記のコードの出力は AttributeError
を返します:
Traceback (most recent call last):
File "c:\Users\akinl\Documents\HTML\python\test.py", line 3, in <module>
urllib.parse.urlencode(queryString)
AttributeError: module 'urllib' has no attribute 'parse'
urllib
をインポートする正しい方法を以下に示します。
import urllib.parse
queryString = {"name": "Jhon", "age": "18"}
urllib.parse.urlencode(queryString)
または、as
キーワードとエイリアス (多くの場合短い) を使用して、Python コードを簡単に記述できます。
import urllib.parse as urlp
queryString = {"name": "Jhon", "age": "18"}
urlp.urlencode(queryString)
上記のすべては、request
、error
、および robotparser
に対して機能します。
import urllib.request
import urllib.error
import urllib.robotparser
これらの一般的なエラーが解決されたので、以前に見たように JSONDecodeError
エラーをスローする URL を操作する際によく使用される json.load()
関数をさらに扱うことができます。
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
load()
メソッドは、引数として受け取った有効な JSON 文字列を解析し、操作のために Python 辞書に変換します。 エラー メッセージは、JSON 値を期待していたが、受け取っていないことを示しています。
これは、コードが JSON 文字列を解析していないか、空文字列を load()
メソッドに解析していないことを意味します。 簡単なコード スニペットでこれを簡単に確認できます。
import json
data = ""
js = json.loads(data)
コードの出力:
Traceback (most recent call last):
File "c:\Users\akinl\Documents\python\texts.py", line 4, in <module>
js = json.loads(data)
File "C:\Python310\lib\json\__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "C:\Python310\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Python310\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
同じエラー メッセージが表示され、エラーの原因が空の文字列引数であることを確認できます。
より詳細な例として、Google Map API にアクセスして、ユーザーの場所 (US または NG など) を収集しようとしますが、値は返されません。
import urllib.parse
import urllib.request
import json
googleURL = "http://maps.googleapis.com/maps/api/geocode/json?"
while True:
address = input("Enter location: ")
if address == "exit":
break
if len(address) < 1:
break
url = googleURL + urllib.parse.urlencode({"sensor": "false", "address": address})
print("Retrieving", url)
uReq = urllib.request.urlopen(url)
data = uReq.read()
print("Returned", len(data), "characters")
js = json.loads(data)
print(js)
コードの出力:
Traceback (most recent call last):
File "C:\Users\akinl\Documents\html\python\jsonArt.py", line 18, in <module>
js = json.loads(str(data))
File "C:\Python310\lib\json\__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "C:\Python310\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Python310\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
同じエラーが発生しました。 ただし、そのようなエラーをキャッチして故障を防ぐために、try/except
ロジックを使用してコードを保護することができます。
したがって、リクエストの時点で API が JSON 値を返さない場合は、エラーではなく別の式を返すことができます。
上記のコードは次のようになります。
import urllib.parse
import urllib.request
import json
googleURL = "http://maps.googleapis.com/maps/api/geocode/json?"
while True:
address = input("Enter location: ")
if address == "exit":
break
if len(address) < 1:
break
url = googleURL + urllib.parse.urlencode({"sensor": "false", "address": address})
print("Retrieving", url)
uReq = urllib.request.urlopen(url)
data = uReq.read()
print("Returned", len(data), "characters")
try:
js = json.loads(str(data))
except:
print("no json returned")
US
として場所を入力したときのコードの出力:
Enter location: US
Retrieving http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=US
Returned 237 characters
no json returned
JSON 値が返されなかったため、コードは no json returned
を出力します。 エラーは制御できない引数が存在しないため、try/except
の使用は重要です。
Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.
LinkedIn関連記事 - Python Error
- AttributeError の解決: 'list' オブジェクト属性 'append' は読み取り専用です
- AttributeError の解決: Python で 'Nonetype' オブジェクトに属性 'Group' がありません
- AttributeError: 'generator' オブジェクトに Python の 'next' 属性がありません
- AttributeError: 'numpy.ndarray' オブジェクトに Python の 'Append' 属性がありません
- AttributeError: Int オブジェクトに属性がありません
- AttributeError: Python で 'Dict' オブジェクトに属性 'Append' がありません