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
相关产品推荐
相关产品推荐

