如何从Flask GET请求中提取JSON列表值并解决JSONDecodeError报错
问题原因
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)报错的本质是Flask端通过requests获取到的响应内容为空,或者不是合法JSON格式,而非JSON提取的语法逻辑存在问题。你当前写的Express接口返回逻辑、Flask端.json()调用写法本身是符合规范的,问题大概率出在Kubernetes集群内的服务调用链路上。
Flask端正确的JSON列表提取方式
你现有代码中循环复制列表的操作属于冗余逻辑,requests调用.json()方法解析JSON数组后会直接返回Python列表,可直接使用。推荐添加异常处理逻辑方便排查问题,参考代码如下:
import requests from flask import render_template, abort @main.route('/') def index(): try: # 添加超时配置,避免请求无限制挂起 resp = requests.get('http://express:8085/url1', timeout=5) # 校验响应状态码,非2xx状态直接抛出异常 resp.raise_for_status() # 解析JSON内容,返回的字符串数组会直接转为Python列表 latest_list = resp.json() # 可选添加格式校验,确保返回结果是预期的列表类型 if not isinstance(latest_list, list): raise ValueError("接口返回格式不符合预期,不是列表类型") except requests.exceptions.ConnectionError: abort(500, description="无法连接到Express服务,请检查服务域名配置") except requests.exceptions.Timeout: abort(500, description="请求Express服务超时") except requests.exceptions.HTTPError as e: abort(500, description=f"Express服务返回错误状态码:{e.response.status_code}") except ValueError as e: abort(500, description=f"响应解析失败:{str(e)}") return render_template('index.html', list_of_names = latest_list)
报错解决步骤
按如下顺序排查即可定位问题:
- 先验证Kubernetes内服务连通性:进入Flask应用的Pod内部,执行
curl http://express:8085/url1查看返回结果- 如果curl提示域名解析失败/连接被拒绝:确认Express应用的Service名称为
express、端口配置为8085、和Flask应用在同一个Namespace下。如果跨Namespace,需要将请求域名改为express.<对应命名空间>.svc.cluster.local - 如果curl返回非JSON内容(比如默认的Nginx错误页、空响应):查看Express应用的Pod日志,排查应用启动、运行报错
- 如果curl提示域名解析失败/连接被拒绝:确认Express应用的Service名称为
- 确认Express接口配置:不要将
res.json(latestList)改为res.send(latestList),res.json()会自动设置Content-Type: application/json响应头,符合JSON接口规范 - 排除中间件干扰:如果集群内部署了服务网格、API网关等中间件,确认没有规则篡改、拦截发往Express服务的请求和响应
内容的提问来源于stack exchange,提问作者Nav
相关产品推荐
相关产品推荐

