Ich analysiere JSON-Daten. Ich habe kein Problem mit dem Parsen und verwende das simplejson
Modul. Einige API-Anfragen geben jedoch einen leeren Wert zurück. Hier ist mein Beispiel:
{
"all" : {
"count" : 0,
"questions" : [ ]
}
}
Dies ist das Segment meines Codes, in dem ich das JSON-Objekt analysiere:
qByUser = byUsrUrlObj.read()
qUserData = json.loads(qByUser).decode('utf-8')
questionSubjs = qUserData["all"]["questions"]
Wie ich für einige Anfragen erwähnt habe, erhalte ich den folgenden Fehler:
Traceback (most recent call last):
File "YahooQueryData.py", line 164, in <module>
qUserData = json.loads(qByUser)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/__init__.py", line 385, in loads
return _default_decoder.decode(s)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/decoder.py", line 402, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/decoder.py", line 420, in raw_decode
raise JSONDecodeError("No JSON object could be decoded", s, idx)
simplejson.decoder.JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0)
Was wäre der beste Weg, um diesen Fehler zu behandeln?
python
json
python-3.x
Add-Semikolons
quelle
quelle
Antworten:
In der Python-Programmierung gibt es eine Regel namens "Es ist einfacher, um Vergebung zu bitten als um Erlaubnis" (kurz: EAFP). Dies bedeutet, dass Sie Ausnahmen abfangen sollten, anstatt die Werte auf Gültigkeit zu überprüfen.
Versuchen Sie daher Folgendes:
try: qByUser = byUsrUrlObj.read() qUserData = json.loads(qByUser).decode('utf-8') questionSubjs = qUserData["all"]["questions"] except ValueError: # includes simplejson.decoder.JSONDecodeError print 'Decoding JSON has failed'
EDIT : Da
simplejson.decoder.JSONDecodeError
tatsächlich vonValueError
( Beweis hier ) erbt , habe ich die catch-Anweisung durch einfaches Verwenden vereinfachtValueError
.quelle
ValueError
Ausnahme vorliegt oder eine andere Ausnahme, von der ebenfalls geerbt wirdValueError
.simplejson
Modul und wirftJSONDecodeError
bei schlechten Eingaben sehr viel auf. Siehe Ihren früheren Link.simplejson
tut dies feinkörniger, aber es hat seine eigenen Probleme. Was würden Sie sagen, wenn dertry...except
Block nur einenjson.loads
Anruf kapseln würde ? Ich denke, das wäre dann besser, würde aber einen Kesselplatz erfordern, um die Anforderungen zu erfüllen (z. B. die Klasse der Ausnahme in etwas Feinkörnigeres zu ändern, aber wir sollten nicht versuchen, die Welt hier zu retten).ValueError
ist zu weit gefasst, um in diesem Zusammenhang verwendet zu werden. In Bezug auf BenutzercodeqUserData["all"]["questions"]
könnteValueError
ich auch werfen . Geschweige denn einValueError
Wesen, das anderswo im Inneren aufgewachsen istsimplejson
. Dies ist die Art von Dingen, die Sie 6 Monate später wirklich hart beißen könnten, wenn die Dinge "ohne Grund" zu brechen beginnenWenn Sie nichts dagegen nicht das Import -
json
Modul, dann ist die beste Art und Weise zu handhaben ist durchjson.JSONDecodeError
(oderjson.decoder.JSONDecodeError
wie sie die gleichen sind) als mit den Standardfehler wieValueError
könnten auch andere Ausnahmen fangen nicht notwendigerweise auf die json dekodieren eine verbunden.from json.decoder import JSONDecodeError try: qByUser = byUsrUrlObj.read() qUserData = json.loads(qByUser).decode('utf-8') questionSubjs = qUserData["all"]["questions"] except JSONDecodeError as e: # do whatever you want
// BEARBEITEN (Okt 2020):
Wie @Jacob Lee im Kommentar erwähnt, könnte es die grundlegende gemeinsame sein
TypeError
angehoben , wenn das JSON - Objekt nicht iststr
,bytes
oderbytearray
. Ihre Frage ist ungefährJSONDecodeError
, aber dennoch ist es wert, hier als Anmerkung erwähnt zu werden; Um auch diese Situation zu bewältigen, aber zwischen verschiedenen Problemen zu unterscheiden, könnte Folgendes verwendet werden:from json.decoder import JSONDecodeError try: qByUser = byUsrUrlObj.read() qUserData = json.loads(qByUser).decode('utf-8') questionSubjs = qUserData["all"]["questions"] except JSONDecodeError as e: # do whatever you want except TypeError as e: # do whatever you want in this case
quelle
JSONDecodeError
also habe ich mich nur auf diese konzentriert, aber Sie haben Recht, und dieser Fall ist definitiv erwähnenswert. Ich habe es in die Antwort aufgenommen.