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 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.
LinkedInVerwandter Artikel - Python Error
- Adresse wird bereits verwendet Fehler in Python
- AttributeError: __Exit__ in Python
- AttributeError: 'Dict'-Objekt hat kein Attribut 'Append' in Python
- AttributeError: 'NoneType'-Objekt hat kein Attribut 'Text' in Python
- AttributeError: Int-Objekt hat kein Attribut
- AttributeError: Modul Urllib hat keine Attributanforderung