Requests: json() membuat interpreter crash dengan JSONDecodeError

Dibuat pada 13 Sep 2017  ·  3Komentar  ·  Sumber: psf/requests

Saya telah mereproduksi ini dengan permintaan v. 2.18.4 dan 2.14.2, bersama dengan Python 3.6.1 dan 3.6.2. Saya telah menggunakan Python/permintaan yang diinstal sistem saya (macOS Sierra dengan Python 3.6.1 diunduh dari python.org), Python/permintaan diinstal sebagai bagian dari conda 4.3.25, dan Python dan permintaan terbaru diinstal dari conda-forge.

Hasil yang sama di mana-mana.

Hasil yang diharapkan

Diharapkan untuk melihat kamus nilai JSON, seperti yang ditunjukkan di sini: http://docs.python-requests.org/en/master/

Hasil Sebenarnya

Penerjemah Python lumpuh.

Langkah Reproduksi

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)

Sistem Informasi

$ 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
}

Komentar yang paling membantu

Hei @justlurking , ini sebenarnya berfungsi seperti yang diharapkan. Metode .json() hanya dapat digunakan pada konten Respons yang dalam format json. Halaman web yang Anda minta mengembalikan dokumen HTML dan karenanya tidak akan berfungsi.

Anda harus memodifikasi header Terima dan mencoba mengambil data json yang valid, atau menambahkan kode untuk menangani kasus data json tidak tersedia. Saya menutup ini karena semuanya berfungsi seperti yang diharapkan.

Semua 3 komentar

Hei @justlurking , ini sebenarnya berfungsi seperti yang diharapkan. Metode .json() hanya dapat digunakan pada konten Respons yang dalam format json. Halaman web yang Anda minta mengembalikan dokumen HTML dan karenanya tidak akan berfungsi.

Anda harus memodifikasi header Terima dan mencoba mengambil data json yang valid, atau menambahkan kode untuk menangani kasus data json tidak tersedia. Saya menutup ini karena semuanya berfungsi seperti yang diharapkan.

Terima kasih atas jawaban yang sangat cepat dan informatif, dan maaf telah membuang waktu Anda. Saya seharusnya menyadari itu mungkin seperti itu mengingat beberapa versi yang saya uji dan kurangnya protes di GitHub. 🤦

Saya membayangkan hal terbaik yang harus dilakukan adalah mengimpor json.JSONDecodeError dan melakukan sesuatu seperti ini?

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

Jadi ini sebenarnya adalah subkelas dari ValueError jadi saya pikir Anda akan dapat menangkapnya jika Anda tidak ingin mengimpor. Terserah Anda pada tingkat kekhususan yang Anda inginkan.

Ide umum itu adalah pendekatan yang saya sarankan. Semoga membantu!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat