Python-Code zum Laden von Daten aus einer langen, komplizierten JSON-Datei:
with open(filename, "r") as f:
data = json.loads(f.read())
(Hinweis: Die beste Codeversion sollte sein:
with open(filename, "r") as f:
data = json.load(f)
aber beide zeigen ein ähnliches Verhalten)
Bei vielen Arten von JSON-Fehlern (fehlende Trennzeichen, falsche Backslashes in Zeichenfolgen usw.) wird eine nette hilfreiche Nachricht gedruckt, die die Zeilen- und Spaltennummer enthält, in der der JSON-Fehler gefunden wurde.
Für andere Arten von JSON-Fehlern (einschließlich des Klassikers "Verwenden von Komma für das letzte Element in einer Liste", aber auch für andere Dinge wie Groß- und Kleinschreibung von wahr / falsch) lautet die Python-Ausgabe jedoch nur:
Traceback (most recent call last):
File "myfile.py", line 8, in myfunction
config = json.loads(f.read())
File "c:\python27\lib\json\__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "c:\python27\lib\json\decoder.py", line 360, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "c:\python27\lib\json\decoder.py", line 378, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
Wie kann Python bei dieser Art von ValueError feststellen, wo der Fehler in der JSON-Datei liegt?
json.load(f)
anstattjson.loads(f.read())
Antworten:
Ich habe festgestellt, dass das
simplejson
Modul in vielen Fällen, in denen das integriertejson
Modul vage ist, aussagekräftigere Fehler enthält . Zum Beispiel für den Fall, dass nach dem letzten Element in einer Liste ein Komma steht:das ist nicht sehr beschreibend. Die gleiche Operation mit
simplejson
:Viel besser! Ebenso für andere häufige Fehler wie Großschreibung
True
.quelle
json
Bibliothek aktualisiert wurde und das neue Fehlermeldungsformat enthält. Ich habe jedoch momentan keine Zeit, genaue Veröffentlichungen zu verfolgen.Sie können Python nicht dazu bringen, Ihnen mitzuteilen, wo der JSON falsch ist. Sie erhalten eine Linter irgendwo online wie verwenden , müssen diese
Dies zeigt Ihnen einen Fehler in dem JSON, den Sie dekodieren möchten.
quelle
Sie können die hier gefundene rson-Bibliothek ausprobieren: http://code.google.com/p/rson/ . Ich habe es auch auf PYPI: https://pypi.python.org/pypi/rson/0.9, so dass Sie easy_install oder pip verwenden können, um es zu bekommen.
für das Beispiel von Tom:
RSON wurde als Obermenge von JSON entwickelt, sodass JSON-Dateien analysiert werden können. Es hat auch eine alternative Syntax, die für Menschen viel schöner anzusehen und zu bearbeiten ist. Ich benutze es ziemlich oft für Eingabedateien.
Was die Großschreibung von Booleschen Werten betrifft: Es scheint, dass rson falsch großgeschriebene Boolesche Werte als Zeichenfolgen liest.
quelle
Ich hatte ein ähnliches Problem und es lag an einfachen Anführungszeichen. Der JSON-Standard ( http://json.org ) spricht nur von der Verwendung von doppelten Anführungszeichen, daher muss es sein, dass die Python-
json
Bibliothek nur doppelte Anführungszeichen unterstützt.quelle
Für meine spezielle Version dieses Problems habe ich die Funktionsdeklaration
load_json_file(path)
in derpackaging.py
Datei durchsucht und dann eineprint
Zeile hineingeschmuggelt:Auf diese Weise wurde der Inhalt der JSON-Datei gedruckt, bevor der Try-Catch eingegeben wurde, und auf diese Weise konnte ich - trotz meiner kaum vorhandenen Python-Kenntnisse - schnell herausfinden, warum meine Konfiguration die JSON-Datei nicht lesen konnte.
(Es war, weil ich meinen Texteditor so eingerichtet hatte, dass er eine UTF-8-Stückliste schreibt… dumm)
Ich erwähne dies nur, weil dies zwar keine gute Antwort auf das spezifische Problem des OP ist, dies jedoch eine ziemlich schnelle Methode war, um die Quelle eines sehr unterdrückenden Fehlers zu bestimmen. Und ich wette, dass viele Leute auf diesen Artikel stoßen werden, die nach einer ausführlicheren Lösung für a suchen
MalformedJsonFileError: No JSON object could be decoded when reading …
. Das könnte ihnen also helfen.quelle
with open(fn) as f
) verwenden. Er behandelt das Schließen der Datei in einer Ausnahme für Sie. en.wikibooks.org/wiki/Python_Programming/...Was mich betrifft, ist meine JSON-Datei sehr groß. Wenn sie
json
in Python verwendet wird, wird der obige Fehler angezeigt.Nach der Installation
simplejson
vonsudo pip install simplejson
.Und dann habe ich es gelöst.
quelle
Ich hatte ein ähnliches Problem, dies war mein Code:
Das Problem war, dass ich vergessen hatte, es zu
file.close()
tun und das Problem zu beheben.quelle
with open(fn) as f
) verwenden. Er behandelt das Schließen der Datei in einer Ausnahme für Sie. en.wikibooks.org/wiki/Python_Programming/...Die akzeptierte Antwort ist die einfachste, um das Problem zu beheben. Für den Fall, dass Sie den simplejson aufgrund Ihrer Unternehmensrichtlinien nicht installieren dürfen, schlage ich die folgende Lösung vor, um das spezielle Problem "Verwenden von Komma für das letzte Element in einer Liste" zu beheben :
Erstellen Sie eine untergeordnete Klasse "JSONLintCheck", um von der Klasse "JSONDecoder" zu erben, und überschreiben Sie die Init- Methode der Klasse "JSONDecoder" wie folgt:
quelle
Treffen Sie einfach das gleiche Problem und in meinem Fall war das Problem mit
BOM
(Byte Order Mark) am Anfang der Datei verbunden.json.tool
Ich würde mich weigern, auch leere Dateien (nur geschweifte Klammern) zu verarbeiten, bis ich die UTF-Stücklistenmarkierung entfernt habe.Was ich getan habe ist:
set nobomb
) entferntDies löste das Problem mit json.tool. Hoffe das hilft!
quelle
Wenn Ihre Datei erstellt wird. Anstatt eine Datei mit Inhalt zu erstellen, ist diese leer. Ersetzen mit:
quelle
Sie könnten cjson verwenden , das behauptet, bis zu 250-mal schneller zu sein als reine Python-Implementierungen, da Sie "eine lange, komplizierte JSON-Datei" haben und diese wahrscheinlich mehrmals ausführen müssen (Decoder schlagen fehl und melden den ersten Fehler, den sie verursachen nur Begegnung).
quelle