600 Stimmen

JSONDecodeError: Wert erwartet: Zeile 1 Spalte 1 (Zeichen 0)

Ich erhalte den Fehler Expecting value: line 1 column 1 (char 0), wenn ich versuche, JSON zu decodieren.

Die URL, die ich für den API-Aufruf verwende, funktioniert im Browser einwandfrei, gibt aber diesen Fehler aus, wenn sie über einen Curl-Aufruf erfolgt. Folgendes ist der Code, den ich für den Curl-Aufruf verwende.

Der Fehler tritt bei return simplejson.loads(response_json) auf

response_json = self.web_fetch(url)
response_json = response_json.decode('utf-8')
return json.loads(response_json)

def web_fetch(self, url):
    buffer = StringIO()
    curl = pycurl.Curl()
    curl.setopt(curl.URL, url)
    curl.setopt(curl.TIMEOUT, self.timeout)
    curl.setopt(curl.WRITEFUNCTION, buffer.write)
    curl.perform()
    curl.close()
    response = buffer.getvalue().strip()
    return response

Traceback:

Datei "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
Datei "/Users/nab/Desktop/pricestore/pricemodels/views.py" in view_category
  620.     apicall=api.API().search_parts(category_id= str(categoryofpart.api_id), manufacturer = manufacturer, filter = filters, start=(catpage-1)*20, limit=20, sort_by='[["mpn","asc"]]')
Datei "/Users/nab/Desktop/pricestore/pricemodels/api.py" in search_parts
  176.         return simplejson.loads(response_json)
Datei "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/__init__.py" in loads
  455.         return _default_decoder.decode(s)
Datei "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in decode
  374.         obj, end = self.raw_decode(s)
Datei "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in raw_decode
  393.         return self.scan_once(s, idx=_w(s, idx).end())

Ausnahmetyp: JSONDecodeError bei /pricemodels/2/dir/
Ausnahme-Wert: Expecting value: line 1 column 1 (char 0)

279voto

Martijn Pieters Punkte 953257

Ihr Code hat eine leere Antwort erzeugt, daher sollten Sie das überprüfen oder die aufgetretene Ausnahme abfangen. Es ist möglich, dass der Server mit einer 204 No Content-Antwort geantwortet hat oder ein Statuscode außerhalb des 200er-Bereichs zurückgegeben wurde (404 Not Found usw.). Überprüfen Sie dies.

Hinweis:

  • Es ist nicht notwendig, die Bibliothek simplejson zu verwenden, dieselbe Bibliothek ist in Python als Modul json enthalten.

  • Es ist nicht erforderlich, eine Antwort von UTF8 in Unicode zu decodieren, die Methode .loads() von simplejson / json kann UTF8-codierte Daten nativ verarbeiten.

  • pycurl hat eine sehr archaische API. Es sei denn, Sie haben einen spezifischen Bedarf für die Verwendung davon, gibt es bessere Alternativen.

Entweder requests oder httpx bieten wesentlich benutzerfreundlichere APIs, einschließlich JSON-Unterstützung. Falls möglich, ersetzen Sie Ihren Aufruf durch:

import requests

response = requests.get(url)
response.raise_for_status()  # wirft eine Ausnahme bei nicht-2xx-Antworten
if response.status_code != 204:
    return response.json()

Natürlich schützt Sie dies nicht vor einer URL, die nicht den HTTP-Standards entspricht; bei der Verwendung beliebiger URLs, bei denen dies möglich ist, überprüfen Sie, ob der Server beabsichtigt, Ihnen JSON zu geben, indem Sie den Content-Type-Header überprüfen, und fangen zur Sicherheit die Ausnahme ab:

if (
    response.status_code != 204 and
    response.headers["content-type"].strip().startswith("application/json")
):
    try:
        return response.json()
    except ValueError:
        # entscheiden Sie, wie Sie mit einem Server umgehen, der in diesem Ausmaß schlecht funktioniert

212voto

alex Punkte 5585

Stellen Sie sicher, dass Sie json.loads() auf den Inhalt der Datei aufrufen und nicht auf den Dateipfad dieses JSON:

json_file_path = "/pfad/zur/beispiel.json"

with open(json_file_path, 'r') as j:
     contents = json.loads(j.read())

Ich glaube, dass viele Leute gelegentlich (einschließlich mir selbst) schuldig daran sind, dies zu tun:

contents = json.load(json_file_path)

105voto

Lorenz Lo Sauer Punkte 22044

Überprüfen Sie die Antwortdaten, ob tatsächliche Daten vorhanden sind und ein Daten-Dump gut formatiert erscheint.

In den meisten Fällen wird Ihr json.loads - JSONDecodeError: Wert erwartet: Zeile 1 Spalte 1 (Zeichen 0) Fehler durch verursacht:

  • nicht konforme Anführungszeichen für JSON
  • XML/HTML-Ausgabe (d. h. ein String, der mit
  • inkompatible Zeichenkodierung

Letztendlich sagt Ihnen der Fehler, dass der String bereits an der allerersten Position nicht mit JSON übereinstimmt.

Als solches, wenn das Parsen trotz eines Daten-Körpers, der auf den ersten Blick JSON-ähnlich aussieht, fehlschlägt, versuchen Sie die Anführungszeichen des Daten-Bodys zu ersetzen:

import sys, json
struct = {}
try:
  try: #versuche zu einem dict zu parsen
    dataform = str(response_json).strip("'<>() ").replace('\'', '\"')
    struct = json.loads(dataform)
  except:
    print repr(resonse_json)
    print sys.exc_info()

Hinweis: Anführungszeichen innerhalb der Daten müssen ordnungsgemäß maskiert werden

53voto

Christophe Roussy Punkte 15183

Mit der requests Bibliothek kann ein JSONDecodeError auftreten, wenn Sie einen HTTP-Fehlercode wie 404 haben und versuchen, die Antwort als JSON zu parsen!

Sie müssen zuerst überprüfen, ob es sich um 200 (OK) handelt, oder zulassen, dass bei einem Fehler eine Ausnahme ausgelöst wird, um diesen Fall zu vermeiden. Ich wünschte, es würde mit einer weniger kryptischen Fehlermeldung fehlschlagen.

HINWEIS: Wie Martijn Pieters in den Kommentaren angegeben hat, können Server bei Fehlern mit JSON antworten (es hängt von der Implementierung ab), daher ist die Überprüfung des Content-Type-Headers zuverlässiger.

29voto

Ramineni Ravi Teja Punkte 3037

Überprüfen Sie das Codierungsformat Ihrer Datei und verwenden Sie das entsprechende Codierungsformat beim Lesen der Datei. Das wird Ihr Problem lösen.

with open("AB.json", encoding='utf-8', errors='ignore') as json_data:
     data = json.load(json_data, strict=False)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X