Requests: json () تعطل المترجم مع خطأ JSONDecodeError

تم إنشاؤها على ١٣ سبتمبر ٢٠١٧  ·  3تعليقات  ·  مصدر: psf/requests

لقد أعدت إنتاج هذا مع طلبات الإصدار 2.18.4 و 2.14.2 ، جنبًا إلى جنب مع Python 3.6.1 و 3.6.2. لقد استخدمت Python / الطلبات المثبتة على النظام (macOS Sierra مع Python 3.6.1 تم تنزيلها من python.org) ، وتم تثبيت Python / الطلبات كجزء من conda 4.3.25 ، وأحدث Python والطلبات المثبتة من conda-forge.

نفس النتائج في كل مكان.

نتيجة متوقعة

من المتوقع رؤية قاموس قيم JSON ، كما هو موضح هنا: http://docs.python-requests.org/en/master/

نتيجة فعلية

تعطل مترجم بايثون.

خطوات التكاثر

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)

معلومات النظام

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

التعليق الأكثر فائدة

مرحبًا @ justlurking ، هذا يعمل بالفعل كما هو متوقع. طريقة .json () قابلة للاستخدام فقط على محتوى الاستجابة بتنسيق json. صفحة الويب التي تطلبها تقوم بإرجاع مستند HTML وبالتالي لن تعمل.

ستحتاج إما إلى تعديل رؤوس Accept الخاصة بك ومحاولة استرداد بيانات json الصالحة ، أو إضافة رمز للتعامل مع حالة عدم توفر بيانات json بسهولة. أنا أغلق هذا لأن الأمور تعمل كما هو متوقع.

ال 3 كومينتر

مرحبًا @ justlurking ، هذا يعمل بالفعل كما هو متوقع. طريقة .json () قابلة للاستخدام فقط على محتوى الاستجابة بتنسيق json. صفحة الويب التي تطلبها تقوم بإرجاع مستند HTML وبالتالي لن تعمل.

ستحتاج إما إلى تعديل رؤوس Accept الخاصة بك ومحاولة استرداد بيانات json الصالحة ، أو إضافة رمز للتعامل مع حالة عدم توفر بيانات json بسهولة. أنا أغلق هذا لأن الأمور تعمل كما هو متوقع.

شكرًا على الرد السريع والغني بالمعلومات ، ونعتذر عن إضاعة وقتك. كان يجب أن أدرك أنه قد يكون شيئًا من هذا القبيل نظرًا للإصدارات المتعددة التي اختبرتها وعدم وجود صرخة على GitHub. 🤦

أتخيل أن أفضل شيء يمكن فعله هو استيراد json.JSONDecodeError والقيام بشيء من هذا القبيل؟

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

لذلك يجب أن يكون هذا في الواقع فئة فرعية من ValueError ، لذا أعتقد أنك ستتمكن من اكتشاف ذلك إذا كنت لا تريد الاستيراد. الأمر متروك لك فيما يتعلق بمستوى الخصوصية الذي تريده.

هذه الفكرة العامة هي النهج الذي أقترحه على الرغم من ذلك. امل ان يساعد!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات