wake-up-neo.com

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

Beim Versuch, JSON zu decodieren, wird die Fehlermeldung 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 durch eine Curl-Anforderung aus. Der folgende Code verwende ich für die Curl-Anfrage.

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

Full 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)
133
user1328021

Um die Konversation in den Kommentaren zusammenzufassen:

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

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

  • pycurl hat eine sehr archaische API. Wenn Sie keine spezielle Anforderung haben, gibt es bessere Möglichkeiten.

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

import requests

return requests.get(url).json()
79
Martijn Pieters

Überprüfen Sie den Antwortdatenhauptteil, ob tatsächliche Daten vorhanden sind und ein Datenabzug als gut formatiert erscheint.

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

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

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

Wenn die Analyse trotz eines Datenkörpers, der auf den ersten Blick JSON wie aussieht, fehlschlägt, 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 innerhalb der Daten müssen ordnungsgemäß geschützt werden 

41
Lorenz Lo Sauer

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 Fehler erhöhen lassen, um diesen Fall zu vermeiden. __ Ich wünschte, es wäre mit einer weniger kryptischen Fehlermeldung fehlgeschlagen.

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

19

Es können eingebettete Nullen vorhanden sein, auch nachdem decode () aufgerufen wurde. 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
3
bryan

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 = {}
1
Alex W

ü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)
1

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 erhielt eine 404-Antwort von der API.

0

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

Es wurde so eingestellt: 'accept-encoding': 'gzip, deflate, br'

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

0
Seu Madruga