JSONDecodeError: Expecting value: line 1 column 1 (char 0)错误总结

在Python中使用requests库获取JSON数据时遇到解析错误,原因是接收到的内容不是有效的JSON格式。错误信息指向JSONDecodeError,表明在尝试解析非JSON内容。检查发现,可能是由于cookies过期导致服务器返回了错误信息,更新headers中的cookies后,成功获取并解析了JSON数据。

读取普通json文件时出现此错误

此处应为json文件的格式错误

  • 字典内键值应带双引号而不是单引号
  • 字典内最后一行应该不带逗号
dict = {
	"key1": 1,
	"key1": 2,
}

爬虫时出现该错误

爬虫时出现错误,主要集中在这一行代码中:

res = requests.get(url,headers=headers).json()

即为读取url中内容用json表示
错误信息如下(用的jupyter notebook):

Y:\Anaconda\envs\python36\lib\site-packages\requests\models.py in json(self, **kwargs)
    898                     # used.
    899                     pass
--> 900         return complexjson.loads(self.text, **kwargs)
    901 
    902     @property

Y:\Anaconda\envs\python36\lib\json\__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    352             parse_int is None and parse_float is None and
    353             parse_constant is None and object_pairs_hook is None and not kw):
--> 354         return _default_decoder.decode(s)
    355     if cls is None:
    356         cls = JSONDecoder

Y:\Anaconda\envs\python36\lib\json\decoder.py in decode(self, s, _w)
    337 
    338         """
--> 339         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    340         end = _w(s, end).end()
    341         if end != len(s):

Y:\Anaconda\envs\python36\lib\json\decoder.py in raw_decode(self, s, idx)
    355             obj, end = self.scan_once(s, idx)
    356         except StopIteration as err:
--> 357             raise JSONDecodeError("Expecting value", s, err.value) from None
    358         return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

如果url传输的是json文件,格式不可能出现问题(排除普通错误情况)
说明读取到内容不是json内容,有可能是返回的访问应答的错误信息error

此时应更新一下headers中的cookies,有可能是上次请求过久,cookies发生改变

更改后成功读取到json信息!!!

当使用 `requests` 库中的 `.json()` 方法解析 HTTP 响应时,如果返回的内容不是合法的 JSON 格式,则会引发 `JSONDecodeError` 异常。以下是针对该问题的具体分析和解决方案: ### 1. 错误的根本原因 `JSONDecodeError` 表明服务器返回的数据无法被正确解析为 JSON 格式。这可能是由于以下原因之一引起的: - **响应内容为空**:服务器可能未返回任何有效数据[^1]。 - **响应内容非 JSON 格式**:例如 HTML 页面或其他类型的文本[^2]。 - **JSON 字符串格式错误**:如缺少双引号、非法字符转义等问题[^3]。 --- ### 2. 解决方案 #### (1)验证响应状态码 在调用 `.json()` 方法之前,先检查请求的状态码是否正常(通常是 200)。如果状态码异常,说明请求本身存在问题,需进一步排查。 ```python import requests url = "http://example.com/api/data" response = requests.get(url) if response.status_code != 200: raise Exception(f"Request failed with status code {response.status_code}") ``` #### (2)确认响应内容不为空 即使状态码为 200,也可能存在空响应的情况。因此需要额外判断响应体是否为空。 ```python if not response.text.strip(): raise ValueError("Response content is empty or contains only whitespace.") ``` #### (3)捕获并处理异常 通过 `try-except` 结构来优雅地处理潜在的解码失败情况,并提供详细的错误信息以便调试。 ```python try: data = response.json() except json.JSONDecodeError as e: error_message = f"Failed to decode JSON: {str(e)}. Response text was: {response.text}" print(error_message) # 可在此处记录日志或采取其他措施 except ValueError as ve: print(f"ValueError occurred while decoding JSON: {ve}.") ``` #### (4)检查实际返回值 某些接口可能会在特定条件下返回非 JSON 的内容(比如错误页面),建议打印原始响应以帮助定位问题。 ```python print(response.headers['Content-Type']) # 查看 Content-Type 是否为 application/json print(response.text) # 打印完整的响应字符串供审查 ``` #### (5)确保输入数据合法性 对于本地测试或者手动构造的 JSON 数据,务必遵循标准语法——键名需要用双引号包裹;避免多余的逗号等常见陷阱[^4]。 --- ### 3. 完整示例代码 下面是一个综合上述要点的安全版 JSON 请求脚本: ```python import requests import json def fetch_and_parse_json(url, params=None, headers=None): try: response = requests.get(url, params=params, headers=headers) if response.status_code != 200: raise Exception(f"HTTP Error {response.status_code}: {response.reason}") if not response.text.strip(): raise ValueError("The server returned an empty response.") if 'application/json' not in response.headers.get('content-type', '').lower(): raise TypeError("Expected a JSON response but received something else.") parsed_data = response.json() return parsed_data except json.JSONDecodeError as je: print(f"JSON Decode Failed: {je}\nRaw Data Received:\n{response.text[:200]}...") except Exception as ex: print(f"An unexpected error occurred: {ex}") # Example Usage url = 'https://movie.douban.com/j/chart/top_list' params = { 'type': '24', 'interval_id': '100:90', 'action': '', 'start': '1', 'limit': '20' } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' } result = fetch_and_parse_json(url, params, headers) if result: print(result) else: print("No valid JSON could be retrieved.") ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值