Beim Versuch, JSON zu dekodieren, wird der Fehler Expecting value: line 1 column 1 (char 0) angezeigt.

Die URL, die ich für den API-Aufruf verwende, funktioniert im Browser einwandfrei, gibt diesen Fehler jedoch aus, wenn dies über eine Curl-Anforderung erfolgt. Das Folgende ist der Code, den ich für die Curl-Anfrage 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

Vollständiger Traceback:

Zurück verfolgen:

File "/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)
File "/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"]]')
File "/Users/nab/Desktop/pricestore/pricemodels/api.py" in search_parts
  176.         return simplejson.loads(response_json)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/__init__.py" in loads
  455.         return _default_decoder.decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in decode
  374.         obj, end = self.raw_decode(s)
File "/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())

Exception Type: JSONDecodeError at /pricemodels/2/dir/
Exception Value: Expecting value: line 1 column 1 (char 0)
327
user1328021 15 Mai 2013 im 23:22

11 Antworten

Beste Antwort

Um das Gespräch in den Kommentaren zusammenzufassen:

  • Es ist nicht erforderlich, die Bibliothek simplejson zu verwenden. In Python ist dieselbe Bibliothek enthalten wie im Modul json.

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

  • pycurl hat eine sehr archaische API. Sofern Sie keine besonderen Anforderungen für die Verwendung haben, gibt es bessere Möglichkeiten.

requests bietet die benutzerfreundlichste API, einschließlich JSON-Unterstützung. Wenn Sie können, ersetzen Sie Ihren Anruf durch:

import requests

return requests.get(url).json()
112
Martijn Pieters 15 Mai 2013 im 21:13

Für mich war es ein Server, der mit etwas anderem als 200 antwortete, und die Antwort war nicht json-formatiert. Ich habe das vor der JSON-Analyse gemacht:

# this is the https request for data in json format
response_json = requests.get() 

# only proceed if I have a 200 response which is saved in status_code
if (response_json.status_code == 200):  
     response = response_json.json() #converting from json to dictionary using json library
1
FastGTR 5 Jän. 2020 im 19:43

Ich denke, es ist erwähnenswert, dass in Fällen, in denen Sie den Inhalt einer JSON-Datei selbst analysieren, Sanity Checks hilfreich sein können, um sicherzustellen, dass Sie tatsächlich json.loads() für den Inhalt von aufrufen die Datei im Gegensatz zum Dateipfad dieses JSON:

json_file_path = "/path/to/example.json"

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

Es ist mir ein wenig peinlich zuzugeben, dass dies manchmal passieren kann:

contents = json.loads(json_file_path)
15
alex 31 Okt. 2019 im 16:13

Ich hatte genau dieses Problem mit Anfragen. Vielen Dank an Christophe Roussy für seine Erklärung.

Zum Debuggen habe ich verwendet:

response = requests.get(url)
logger.info(type(response))

Ich habe eine 404-Antwort von der API erhalten.

1
Kelsie Braidwood 20 Sept. 2018 im 15:12

Ich hatte das gleiche Problem mit Anfragen (die Python-Bibliothek). Es war zufällig der accept-encoding Header.

Es wurde folgendermaßen eingestellt: 'accept-encoding': 'gzip, deflate, br'

Ich habe es einfach aus der Anfrage entfernt und den Fehler nicht mehr erhalten.

0
Seu Madruga 19 Nov. 2018 im 10:08

Dies liegt häufig daran, dass die Zeichenfolge, die Sie analysieren möchten, leer ist:

>>> import json
>>> x = json.loads("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/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)

Sie können Abhilfe schaffen, indem Sie vorher prüfen, ob json_string leer ist:

import json

if json_string:
    x = json.loads(json_string)
else:
    // Your logic here
    x = {}
8
Alex W 6 Mai 2019 im 20:58

Überprüfen Sie den Antwortdatenkörper, ob tatsächliche Daten vorhanden sind und ein Datendump gut formatiert zu sein scheint.

In den meisten Fällen ist Ihr Fehler json.loads - JSONDecodeError: Expecting value: line 1 column 1 (char 0) auf Folgendes zurückzuführen:

  • nicht JSON-konformes Zitat
  • XML / HTML-Ausgabe (dh eine Zeichenfolge, die mit
  • inkompatible Zeichenkodierung

Letztendlich sagt Ihnen der Fehler, dass die Zeichenfolge bereits an der ersten Position nicht mit JSON übereinstimmt.

Wenn das Parsen trotz eines Datenkörpers fehlschlägt, der auf den ersten Blick JSON-ähnlich aussieht, ersetzen Sie die Anführungszeichen des Datenkörpers:

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

Hinweis: Anführungszeichen in den Daten müssen ordnungsgemäß maskiert werden

56
Lorenz Lo Sauer 27 Aug. 2013 im 08:48

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

with open("AB.json",encoding='utf-16', errors='ignore') as json_data:
     data = json.load(json_data, strict=False)
7
Ramineni Ravi Teja 6 März 2019 im 06:21

Mit der requests lib kann JSONDecodeError passieren, wenn Sie einen http-Fehlercode wie 404 haben und versuchen, die Antwort als JSON zu analysieren!

Sie müssen zuerst nach 200 (OK) suchen oder es bei einem Fehler auslösen lassen, um diesen Fall zu vermeiden. Ich wünschte, es wäre mit einer weniger kryptischen Fehlermeldung fehlgeschlagen.

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

29
Christophe Roussy 31 Aug. 2018 im 14:20

Für mich wurde in der Anfrage keine Authentifizierung verwendet.

0
Neel0507 12 Dez. 2019 im 16:34

Es können eingebettete Nullen vorhanden sein, auch nach dem Aufruf von decode (). Verwenden Sie replace ():

import json
struct = {}
try:
    response_json = response_json.decode('utf-8').replace('\0', '')
    struct = json.loads(response_json)
except:
    print('bad json: ', response_json)
return struct
4
bryan 29 Sept. 2017 im 19:13