Requests: json() stürzt den Interpreter mit einem JSONDecodeError ab

Erstellt am 13. Sept. 2017  ·  3Kommentare  ·  Quelle: psf/requests

Ich habe dies mit Anfragen v. 2.18.4 und 2.14.2 reproduziert, zusammen mit Python 3.6.1 und 3.6.2. Ich habe mein systeminstalliertes Python/Requests (macOS Sierra mit Python 3.6.1 heruntergeladen von python.org), Python/Requests als Teil von conda 4.3.25 installiert und das neueste Python und Requests von conda-forge installiert.

Überall gleiche Ergebnisse.

erwartetes Ergebnis

Es wird erwartet, dass ein Wörterbuch mit JSON-Werten angezeigt wird, wie hier angegeben: http://docs.python-requests.org/en/master/

Tatsächliche Ergebnis

Python-Interpreter stürzt ab.

Reproduktionsschritte

Python 3.6.2 | packaged by conda-forge | (default, Jul 23 2017, 23:01:38) 
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> r = requests.get('https://pypi.python.org/pypi')
>>> r.status_code
200
>>> r.encoding
'utf-8'
>>> r.json()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/psimpson/miniconda3/envs/test/lib/python3.6/site-packages/requests/models.py", line 892, in json
    return complexjson.loads(self.text, **kwargs)
  File "/Users/psimpson/miniconda3/envs/test/lib/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/Users/psimpson/miniconda3/envs/test/lib/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/Users/psimpson/miniconda3/envs/test/lib/python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

System Information

$ python -m requests.help
{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": "2.0.3"
  },
  "idna": {
    "version": ""
  },
  "implementation": {
    "name": "CPython",
    "version": "3.6.2"
  },
  "platform": {
    "release": "16.7.0",
    "system": "Darwin"
  },
  "pyOpenSSL": {
    "openssl_version": "100020cf",
    "version": "17.2.0"
  },
  "requests": {
    "version": "2.18.4"
  },
  "system_ssl": {
    "version": "100020cf"
  },
  "urllib3": {
    "version": "1.22"
  },
  "using_pyopenssl": true
}

Hilfreichster Kommentar

Hey @justlurking , das funktioniert tatsächlich wie erwartet. Die Methode .json() kann nur für Antwortinhalte verwendet werden, die im json-Format vorliegen. Die von Ihnen angeforderte Webseite gibt ein HTML-Dokument zurück und funktioniert daher nicht.

Sie müssen entweder Ihre Accept-Header ändern und versuchen , gültige Json-Daten abzurufen, oder Code hinzufügen, um den Fall zu behandeln, dass Json-Daten nicht ohne weiteres verfügbar sind. Ich schließe dies, da die Dinge wie erwartet funktionieren.

Alle 3 Kommentare

Hey @justlurking , das funktioniert tatsächlich wie erwartet. Die Methode .json() kann nur für Antwortinhalte verwendet werden, die im json-Format vorliegen. Die von Ihnen angeforderte Webseite gibt ein HTML-Dokument zurück und funktioniert daher nicht.

Sie müssen entweder Ihre Accept-Header ändern und versuchen , gültige Json-Daten abzurufen, oder Code hinzufügen, um den Fall zu behandeln, dass Json-Daten nicht ohne weiteres verfügbar sind. Ich schließe dies, da die Dinge wie erwartet funktionieren.

Vielen Dank für die superschnelle und informative Antwort und entschuldigen Sie, dass Sie Ihre Zeit verschwendet haben. Ich hätte erkennen müssen, dass es angesichts der mehreren von mir getesteten Versionen und des fehlenden Aufschreis auf GitHub so ähnlich sein könnte. 🤦

Ich stelle mir vor, das Beste wäre, json.JSONDecodeError zu importieren und so etwas zu tun?

try:
    r.json()
except JSONDecodeError as e:
    <handle exception>

Dies sollte also eigentlich eine Unterklasse von ValueError sein, also denke ich, dass Sie das abfangen können, wenn Sie nicht importieren möchten. Es liegt an Ihnen, welche Spezifität Sie möchten.

Diese allgemeine Idee ist der Ansatz, den ich jedoch vorschlagen würde. Ich hoffe, das hilft!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen