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

Flask API返回数据库数值列表遇JSON序列化错误求助

解决Flask API返回数据库时间戳数组的JSON序列化问题

看起来你卡在了数据库查询结果无法被JSON序列化的问题上,这在Web开发初期很常见,我来帮你一步步解决:

首先明确错误核心:fetchall()返回的是数据库游标生成的结果集(通常是元组的列表,比如[(1547515344323L, 0L, 1566222293827L)]),而且这些数值可能是数据库驱动返回的特殊长整型类型,Flask的默认JSON编码器没法直接处理它们。另外你代码里的event_results[]是语法错误,应该直接用event_results,不过这不是主要问题。

下面是具体的解决方案:

1. 先把结果集转成普通Python结构

数据库返回的元组列表需要先转换成可被JSON识别的普通列表(或字典),同时处理数值类型:

event_results = event_list.fetchall()
# 将每个元组转成列表,同时把长整型转成普通int(兼容Python2/3)
serializable_data = [[int(val) for val in row] for row in event_results]

如果你的查询结果只有一行(比如单个集群的时间数据),可以直接取第一个元素转成一维数组:

if serializable_data:
    serializable_data = serializable_data[0]

2. 使用Flask的jsonify代替手动序列化

不要用json.dumps手动处理,Flask的jsonify函数会自动处理序列化细节,还会设置正确的Content-Type响应头:

from flask import jsonify

# 替换你原来的return语句
return jsonify({"data": serializable_data})

3. 完整示例代码

把整个流程串起来,大概是这样:

from flask import Flask, jsonify
# 导入你的数据库操作模块
import your_db_module

app = Flask(__name__)

@app.route('/cluster-timestamps')
def get_cluster_timestamps():
    # 你的查询语句
    query = "SELECT created_time, deleted_time, last_updated_time FROM clusters WHERE cluster_id = ?"
    # 假设execute_db_query返回游标对象
    event_list = your_db_module.execute_db_query(query)
    event_results = event_list.fetchall()
    
    # 转换为可序列化的结构
    serializable_data = [[int(val) for val in row] for row in event_results]
    # 如果是单条结果,转成一维数组
    if len(serializable_data) == 1:
        serializable_data = serializable_data[0]
    
    return jsonify({"data": serializable_data})

额外优化建议

  • 返回字典更友好:如果前端需要知道每个数值的含义,把结果转成字典会更清晰,比如:
    serializable_data = [
        {
            "created_timestamp": int(row[0]),
            "deleted_timestamp": int(row[1]),
            "last_updated_timestamp": int(row[2])
        }
        for row in event_results
    ]
    
  • 直接返回日期字符串:毫秒时间戳对前端不太友好,可以在API里转换成ISO日期字符串,减少前端工作量:
    from datetime import datetime
    
    def ms_to_iso(ms):
        if ms == 0:
            return None  # 用None表示未删除状态
        return datetime.fromtimestamp(ms / 1000).isoformat()
    
    serializable_data = [
        {
            "created": ms_to_iso(row[0]),
            "deleted": ms_to_iso(row[1]),
            "updated": ms_to_iso(row[2])
        }
        for row in event_results
    ]
    

这样处理后,你的API就能正常返回可被前端解析的JSON数据,前端拿到后就可以轻松渲染到HTML表格里啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:55:45