【问题标题】:Python requests - JSONDecodeError("Expecting value", s, err.value) from NonePython 请求 - JSONDecodeError("Expecting value", s, err.value) from None
【发布时间】:2020-04-19 17:04:28
【问题描述】:

我正在尝试从 api 获取响应,但无法将其加载到字典中。

这是我的代码:

r = session.post(url, headers=headers, json=payload)

返回的status code200,所以我得到了回复。

通过尝试做:reply = r.json() 我得到:

Traceback (most recent call last):
  File "C:/Users/PycharmProjects/honeymonitor/main.py", line 46, in <module>
    data = get_data(session)
  File "C:/Users/PycharmProjects/honeymonitor/main.py", line 35, in get_data
    reply = r.json()
  File "C:\Users\PycharmProjects\honeymonitor\venv\lib\site-packages\requests\models.py", line 897, in json
    return complexjson.loads(self.text, **kwargs)
  File "C:\Users\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "C:\Users\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\AppData\Local\Programs\Python\Python37\lib\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)

通过使用reply = r.text,我得到了很多乱码:

� d�M���)b�b��$�j�np������X2�Al�w{g��wO�n-���w��g�����}�1�Y5@�R��/�
�   X���o]>6,�N�_#�#Ң����K�@���s
��Ɩ�ː�����2��N�:D��p�����7{K��������V��
-")�p0n@I�f!���Q�+| /We�.�p�=����u���-�ʌ�cs�"jfH����}qkː��q�,q�bږq�ٟ��Z���>��U#�����ET�V/��+cU����ʁ�LLe��(���V�2���å}�UC���@�8y��B�7Λ��c���Y?��q��TOMTv{����ߎ������,�[�|��wf_�˰�g������?

post请求头中的内容类型是:

'Content-Type': 'application/json;charset=UTF-8',              

另外通过检查r.encoding 我得到None

最后我尝试了json.loads(r.text),但我得到了同样的错误。 还尝试使用r.content.decode('utf-8') 对响应进行编码 并得到UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 1: invalid continuation byte

我做错了什么?

编辑:

我试过用 Fiddler 复制请求,我可以清楚地看到响应 json 那里

我已经比较了 Fiddler 和请求之间的响应头,唯一的区别是请求头中有 'Transfer-Encoding': 'chunked'

EDIT2:

这是r.content的一部分:

b'\x03\xd5\x01\x00d\xca9\x9cvwC\x7f \x1b]j\xfb\xc5\xa3tA\xa1k.N9\x01\x08\x03\r\xcc\x02i\x01\xb7\x0b\xc2=\xc6\x92\xb1\rb\xe3\xbf\xdb;\x83\xb7\xbf{\xe2vk\xd1\xed\xef\xbf[d<{.n\x7fo\xd5WC\xab\x84\xeb\xecN\xd3#\xcc\xed\x0cAks\xa5\xe6\x87?\x15\xb3:\x8d\xfdS}\xb5O\x9a\xb8\x9d\xddK\x98\xf5+HSLq\x14\x84\xab:Fd!\xa8\xc0\x0c\xd2\xd3\x0eL\xd4\xec\x9b\xcb\xf2\xcf\xae\x18\xd9\x15&fg\xbf\xd6.```

【问题讨论】:

  • 是否有“内容编码”标头?如果有,它的价值是什么?
  • 不,没有
  • 我已经编辑了问题,添加了一些我认为有用的信息
  • 在您将乱码转换为字符串之前,您将无法解析它。我怀疑响应被压缩了,但是服务器错误地没有声明这个事实,所以requests 不会为你透明地解压缩数据。 r.raw 显示什么?
  • 它看起来像一个压缩的(可能是 gzip 压缩的)内容

标签: json python-3.x utf-8 python-requests


【解决方案1】:

这个错误可能有几个原因
我遇到了同样的错误。就我而言,我正在调用put URL。在你的情况下,它是post
我以这样一种方式实现了我的 put API,它不会返回除状态码之外的任何内容。所以收到响应体后包含no data。我们正在尝试将其解析为 JSON。但实际上没有什么可以解析的。

【讨论】:

  • 用 fiddler 我得到了要解析的数据,奇怪的是用 python 不起作用
猜你喜欢
  • 2022-06-11
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 2021-09-29
  • 2019-08-06
  • 2019-09-18
相关资源
最近更新 更多