【问题标题】:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) pythonjson.decoder.JSONDecodeError:期望值:第 1 行第 1 列(字符 0)python
【发布时间】:2023-03-25 10:08:01
【问题描述】:

我收到以下错误消息:

...文件“c:\users\dockerhost\appdata\local\programs\python\python37\Lib\json\decoder.py”,第 355 行,在 raw_decode 从 None 提高 JSONDecodeError("Expecting value", s, err.value) json.decoder.JSONDecodeError:预期值:第 1 行第 1 列(字符 0)

我正在尝试使用请求来获取响应标头。我已经对尝试解决 jsondecodeerror 进行了大量研究。但是,我没有找到解决方案。

import requests
request.get('https://www.google.com/').json()

Error message.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Host\.virtualenvs\projects08-8iyGSYl4\lib\site-packages\requests\models.py", line 897, in json
    return complexjson.loads(self.text, **kwargs)
  File "c:\users\host\appdata\local\programs\python\python37\Lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "c:\users\host\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\host\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)

【问题讨论】:

  • 从这个链接尝试解决方案 - stackoverflow.com/questions/16573332/…
  • @amrs-tech 我尝试了该解决方案但没有成功。您尝试解决了吗?
  • 实际上没有,该解决方案告诉了许多方法,您是否尝试过解析您的响应然后调用 json ?
  • 您链接了两个调用,它们中的哪一个导致了问题?
  • 文档详细说明了这一点:2.python-requests.org/en/master/user/quickstart/…这不是您所追求的方法吗?

标签: python python-requests


【解决方案1】:

为避免此错误,请首先检查您收到的 status_code 是否与 200 不同。可能服务器正在返回 &lt;Response [204]&gt;

my_response = requests.get(MY_URL)
if my_response.status_code == 200:
    my_response.json()

else:
   ...

【讨论】:

    【解决方案2】:

    使用 request.get('https://www.google.com/').json() 时,您会盲目地将 HTTP 响应内容转换为 JSON。响应可能是也可能不是 JSON,具体取决于 URL。在这里,谷歌页面是 HTML 而不是 JSON。

    documentation 可以清楚地看出,如果内容不是 JSON,json() 调用将引发错误。

    但是,您提到了响应标头。可以使用 request.get('https://www.google.com/').headers 访问响应标头,这是标头的字典表示。如果你希望它是 json,只需像这样加载它

    import json
    import requests
    header_json = json.dumps(dict(requests.get('https://www.google.com/').headers))
    pprint(header_json)
    

    这会给你类似的结果

    {
        "Alt-Svc": "quic=\":443\"; ma=2592000; v=\"46,43,39\"",
        "Cache-Control": "private, max-age=0",
        "Content-Encoding": "gzip",
        "Content-Type": "text/html; charset=ISO-8859-1",
        "Date": "Wed, 28 Aug 2019 06:20:28 GMT",
        "Expires": "-1",
        "P3P": "CP=\"This is not a P3P policy! See g.co/p3phelp for more info.\"",
        "Server": "gws",
        "Set-Cookie": "######################removed purposefully##########################",
        "Transfer-Encoding": "chunked",
        "X-Frame-Options": "SAMEORIGIN",
        "X-XSS-Protection": "0"
    }
    

    这是你想要达到的目标吗?

    【讨论】:

      【解决方案3】:

      从文档中,

      ResponseObj.json()
      

      返回结果的 JSON 对象(如果结果是 JSON 格式,否则会引发错误)

      由于结果不是 JSON 格式,因此您收到错误。

      如果结果是有效的 JSON,

      >>> requests.get('https://jsonplaceholder.typicode.com/todos/1').json()
      {'userId': 1, 'id': 1, 'title': 'delectus aut autem', 'completed': False}
      

      该函数确实返回一个 JSON。

      【讨论】:

        【解决方案4】:

        JSON 解码器在第一行的第一个字符处期望一个值,这意味着它没有找到要解析的内容。也就是说,你的响应对象的内容是空的。

        您应该检查服务器响应的内容:

        print(request.get(your_url).content)
        

        确保它不为空并且实际上是有效的 JSON。

        如果它确实是空的,这通常意味着您没有向服务器发送它所期望的内容,并且您应该修复随请求发送的标头/cookies/身份验证/API 密钥/参数。

        【讨论】:

        • 不是空文件。
        • 您发布的特定错误消息只能在响应内容为空时发生。如果您确定响应不为空并且实际上是有效的 JSON,您可以使用 import jsonprint(json.loads(request.get(your_url).text))) 自行解析。
        猜你喜欢
        • 2020-11-11
        • 2017-05-09
        • 2019-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-21
        • 1970-01-01
        相关资源
        最近更新 更多