Python で Raise JSONDecodeError(Expected Value, S, err.value) From None を解決する

Olorunfemi Akinlua 2023年10月10日
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)

上記のすべては、requesterror、および 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 Akinlua avatar Olorunfemi Akinlua avatar

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