Lösen Sie Raise JSONDecodeError(Expecting Value, S, err.value) From None in Python

Olorunfemi Akinlua 10 Oktober 2023
Lösen Sie Raise JSONDecodeError(Expecting Value, S, err.value) From None in Python

Beim Arbeiten mit URLs und APIs in Pythons müssen Sie häufig die Bibliotheken urllib und json verwenden. Noch wichtiger ist, dass die json-Bibliothek bei der Verarbeitung von JSON-Daten hilft, was die Standardmethode zum Übertragen von Daten ist, insbesondere bei APIs.

Innerhalb der Bibliothek json gibt es eine Methode loads(), die den Fehler JSONDecodeError zurückgibt. In diesem Artikel werden wir erörtern, wie Sie solche Fehler beheben und angemessen damit umgehen können.

Verwenden Sie try, um raise JSONDecodeError("Expecting value", s, err.value) from None in Python zu lösen

Bevor wir uns mit JSON beschäftigten, mussten wir oft Daten über das Paket urllib empfangen. Bei der Arbeit mit dem urllib-Paket ist es jedoch wichtig zu verstehen, wie ein solches Paket in Ihren Code importiert wird, da dies zu Fehlern führen kann.

Damit wir das Paket urllib verwenden können, müssen wir es importieren. Oft importieren die Leute es wie unten.

import urllib

queryString = {"name": "Jhon", "age": "18"}
urllib.parse.urlencode(queryString)

Die Ausgabe des obigen Codes ergibt einen 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'

Wie die urllib korrekt importiert wird, sehen Sie unten.

import urllib.parse

queryString = {"name": "Jhon", "age": "18"}
urllib.parse.urlencode(queryString)

Alternativ können Sie das Schlüsselwort as und Ihren Alias (oft kürzer) verwenden, um das Schreiben Ihres Python-Codes zu vereinfachen.

import urllib.parse as urlp

queryString = {"name": "Jhon", "age": "18"}
urlp.urlencode(queryString)

Alle oben genannten Arbeiten für request, error und robotparser:

import urllib.request
import urllib.error
import urllib.robotparser

Nachdem diese häufigen Fehler aus dem Weg geräumt sind, können wir uns weiter mit der Funktion befassen, die häufig mit der Bibliothek urllib arbeitet, wenn sie mit URLs arbeitet, die den Fehler JSONDecodeError auslöst, wie zuvor gesehen, nämlich json.load() Funktion.

raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Die Methode load() analysiert einen gültigen JSON-String, den sie als Argument erhält, und konvertiert ihn zur Bearbeitung in ein Python-Wörterbuch. Die Fehlermeldung zeigt, dass es einen JSON-Wert erwartet, aber keinen erhalten hat.

Das bedeutet, dass Ihr Code weder den JSON-String noch einen leeren String für die Methode load() geparst hat. Ein schnelles Code-Snippet kann dies leicht überprüfen.

import json

data = ""

js = json.loads(data)

Die Ausgabe des Codes:

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)

Dieselbe Fehlermeldung ist vorhanden, und wir können feststellen, dass der Fehler von einem leeren String-Argument herrührt.

Lassen Sie uns für ein detaillierteres Beispiel versuchen, auf eine Google Map API zuzugreifen und den Benutzerstandort zu erfassen, z. B. US oder NG, aber es gibt keinen Wert zurück.

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)

Die Ausgabe des Codes:

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)

Wir haben den gleichen Fehler erhalten. Um solche Fehler abzufangen und einen Ausfall zu verhindern, können wir jedoch die try/except-Logik verwenden, um unseren Code zu schützen.

Wenn die API daher an einem Anforderungspunkt keinen JSON-Wert zurückgibt, können wir einen anderen Ausdruck und keinen Fehler zurückgeben.

Der obige Code wird zu:

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

Die Ausgabe des Codes, wenn wir den Ort als US eingeben:

Enter location: US
Retrieving http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=US
Returned 237 characters
no json returned

Da kein JSON-Wert zurückgegeben wurde, druckt der Code no json return. Da der Fehler eher das Nichtvorhandensein eines nicht kontrollierbaren Arguments ist, ist die Verwendung von try/except wichtig.

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

Verwandter Artikel - Python Error