requests请求公交接口调用response.json()报JSON格式错误如何解决
报错原因
Expecting property name enclosed in double quotes: line 1 column 3是JSON解析阶段抛出的语法错误,触发原因是你请求的接口返回内容不符合标准JSON规范:标准JSON要求所有键名必须用双引号包裹,不允许出现单引号键名、首尾多余非JSON字符、JSONP函数包裹等情况。
你当前代码里直接打印response只能拿到HTTP响应的状态对象(比如<Response [200]>),看不到接口实际返回的文本内容,自然无法定位格式问题。
修复步骤
- 第一步:先获取接口返回的原始内容,不要直接调用
.json()
把原有代码替换为以下内容,先确认接口实际返回的数据形态:
import requests url = 'http://passio3.com/www/mapGetData.php?getBuses=1&deviceId=1683997&wTransloc=1' response = requests.get(url) # 打印响应状态码,确认请求是否正常到达服务端 print("响应状态码:", response.status_code) # 打印原始返回文本,定位格式问题 print("原始返回内容:", response.text)
- 第二步:根据原始返回的格式选择对应的解析方式
这类公交查询接口返回非标准JSON是非常常见的情况,对应处理方案如下:- 如果返回内容是用单引号包裹键值的类JSON结构:不要用requests自带的
.json()方法,改用Python内置的ast模块安全解析:import ast data = ast.literal_eval(response.text) - 如果返回内容是JSONP格式(内容被函数名包裹,形态类似
getData({...})):先剥离首尾的函数包裹字符,再做JSON解析:import json # 剥离首尾的JSONP包裹部分,提取纯JSON字符串 pure_json = response.text.strip().split('(', 1)[1].rsplit(')', 1)[0] data = json.loads(pure_json) - 如果返回内容首尾有多余空白、BOM头:先对
response.text调用.strip()方法清理首尾无效字符,再尝试解析。
- 如果返回内容是用单引号包裹键值的类JSON结构:不要用requests自带的
如果打印原始内容发现返回的是HTML页面、权限拦截提示,说明你的请求缺少必要的身份标识头(比如
User-Agent、访问令牌、Cookie),需要先从浏览器开发者工具的网络面板中,复制正常访问该接口时携带的请求头,加到requests请求参数中再发起请求。
内容的提问来源于stack exchange,提问作者LexLuger
相关产品推荐
相关产品推荐

