You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python的requests与sys库实现货币兑换时遇JSON解码错误

问题分析与解决方案

错误根源

你遇到的JSONDecodeError本质是API返回的内容不是合法的JSON格式,核心原因有两个:

  • 请求日期为非交易日:2020-01-01是元旦,法兰克福外汇市场休市,API无法获取当日汇率,返回了错误页面而非预期的JSON数据。
  • 缺少请求有效性校验:代码直接调用response.json(),没有先检查请求是否成功(比如HTTP状态码是否为200),导致非JSON内容被强行解码。

修复步骤

1. 增加请求状态校验

在处理响应前,先通过response.raise_for_status()检查请求是否成功,若状态码不是200则直接抛出异常,避免无效解码:

import sys
import requests

date = str(sys.argv[1])
from_currency = str(sys.argv[2]).upper()
to_currency = str(sys.argv[3]).upper()
amount = float(sys.argv[4])

response = requests.get(f"https://api.frankfurter.app/{date}?amount={amount}&from={from_currency}&to={to_currency}")

# 校验请求是否成功,失败则抛出HTTP错误
response.raise_for_status()

data = response.json()
print(f"{amount} {from_currency} is {data['rates'][to_currency]} {to_currency} on {date}")

2. 添加异常处理增强鲁棒性

针对非交易日、无效参数等场景,添加异常捕获,给出明确提示:

import sys
import requests

date = str(sys.argv[1])
from_currency = str(sys.argv[2]).upper()
to_currency = str(sys.argv[3]).upper()
amount = float(sys.argv[4])

try:
    response = requests.get(f"https://api.frankfurter.app/{date}?amount={amount}&from={from_currency}&to={to_currency}")
    response.raise_for_status()  # 检查HTTP状态
    data = response.json()
    print(f"{amount} {from_currency} is {data['rates'][to_currency]} {to_currency} on {date}")
except requests.exceptions.HTTPError as e:
    print(f"请求失败:{str(e)},大概率是日期为非交易日或参数无效")
except requests.exceptions.JSONDecodeError:
    print("API返回内容格式错误,请检查请求参数或API服务状态")

3. 验证输入参数

  • 确保日期格式严格为YYYY-MM-DD,且为外汇市场交易日(避开周末、法定节假日)
  • 确认货币代码是API支持的标准代码(如USD、GBP、EUR等)

测试有效日期

将命令改为交易日的日期即可正常运行,比如:

python main.py '2020-01-02' 'USD' 'GBP' 2

内容的提问来源于stack exchange,提问作者Sameer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:18:27