调用Dukascopy API提取JSON时出现JSONDecodeError报错如何解决?
问题原因
- 你调用的接口返回的是JSONP格式的数据,而非标准JSON格式。从你提供的请求URL可以看到尾部带有
jsonp=_callbacks____1kvynkpid参数,JSONP的返回结构是回调函数名包裹JSON内容,格式类似_callbacks____1kvynkpid({"key": "value"}),不是纯JSON字符串,所以直接调用r.json()会从第一行第一列就无法识别JSON结构,触发对应报错。
解决方法
方案1:移除JSONP参数(优先推荐)
大多数支持JSONP的接口如果不传jsonp参数,会直接返回标准JSON。你可以先把URL尾部的&jsonp=_callbacks____1kvynkpid参数删除后再发起请求,即可直接解析JSON。
修改后的代码示例:
import requests import pandas as pd # 移除jsonp参数后的请求URL Request_URL = "https://freeserv.dukascopy.com/2.0/api/group=quotes&method=realtimeSentimentIndex&enabled=true&key=bsq3l3p5lc8w4s0c&type=swfx" r = requests.get(Request_URL) df = pd.DataFrame(r.json())
方案2:处理JSONP返回内容
如果接口必须要求传jsonp参数,你可以手动提取返回内容中被包裹的JSON部分再解析:
修改后的代码示例:
import json import requests import pandas as pd Request_URL = "https://freeserv.dukascopy.com/2.0/api/group=quotes&method=realtimeSentimentIndex&enabled=true&key=bsq3l3p5lc8w4s0c&type=swfx&jsonp=_callbacks____1kvynkpid" r = requests.get(Request_URL) # 提取JSONP括号内的纯JSON内容 jsonp_content = r.text # 找到第一个左括号和最后一个右括号的位置,截取中间内容 json_str = jsonp_content[jsonp_content.find('(')+1 : jsonp_content.rfind(')')] # 解析JSON data = json.loads(json_str) df = pd.DataFrame(data)
内容的提问来源于stack exchange,提问作者Bayrem
相关产品推荐
相关产品推荐

