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

Python构建JSON文件时datetime与字符串拼接报错求助

问题排查及修复方案

根本原因

你的报错发生在字典构造的字符串拼接阶段,早于JSON序列化流程,因此你配置的DateTimeEncoder还没有机会生效,自然解决不了这个阶段的类型错误。

具体错误点

  • 字典构造语法错误:你使用'Numero Requisicao:'+row[0]的写法是把键名字符串和字段值直接拼接成单个字符串,最终生成的是集合而非你预期的键值对字典,正确的字典语法为{"键名": 值},键和值之间用冒号分隔,不需要加号。
  • 提前类型拼接错误:数据库返回的日期字段row[2]/row[3]是datetime.datetime类型,你直接和字符串用+拼接,会直接触发类型错误,这一步还没到JSON序列化环节,所以自定义编码器不生效。
  • 额外语法错误:你原有DateTimeEncoder类中return super(...)那行缩进错误,处于default方法外,会直接报语法错误。
  • 隐藏问题:代码中直接使用conn变量但没有提前创建数据库连接,运行时会报变量未定义错误。

修复后完整代码

import mysql.connector
import json
from datetime import datetime

class DateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, (datetime.datetime, datetime.date, datetime.time)):
            return obj.isoformat()
        elif isinstance(obj, datetime.timedelta):
            return (datetime.datetime.min + obj).time().isoformat()
        # 缩进修正,放到default方法内部
        return super(DateTimeEncoder, self).default(obj)
    
def GetRequisicoes():
    # 补充数据库连接配置,根据你的实际情况修改参数
    conn = mysql.connector.connect(
        host="你的数据库地址",
        user="你的用户名",
        password="你的密码",
        database="你的库名"
    )
    json_requisicoes = []
    select_requisicoes = ("""SELECT * FROM data_req
                             WHERE DATE(sla_due_date_req) <= DATE(NOW()) 
                             AND status_req NOT LIKE 'Pendente'
                             ORDER BY n_req ASC;""")
    cursor = conn.cursor()
    cursor.execute(select_requisicoes)
    result = cursor.fetchall()
        
    for row in result:
        # 修正字典语法,键值用冒号分隔,不提前拼接
        json_requisicoes.append({
            "Numero Requisicao": row[0],
            "Status": row[1],
            "Data de Abertura": row[2],
            "Prazo": row[3],
            "Descricao": row[4]
        })
    with open("./output_requisicoes.json", 'w', encoding='utf-8') as f:
        # 这里才会触发DateTimeEncoder处理datetime类型
        json.dump(json_requisicoes, f, ensure_ascii=False, indent=4, cls=DateTimeEncoder) 
    cursor.close()
    conn.close()

# 执行函数
if __name__ == "__main__":
    GetRequisicoes()

说明

修正后代码不会提前处理datetime类型,而是在JSON序列化阶段由你写的DateTimeEncoder自动将datetime类型转为ISO格式字符串,既避免了拼接报错,也保留了正确的字典结构。

内容的提问来源于stack exchange,提问作者Danilo Uchôa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:45:04