Discord组件开发报错:ActionRow类型对象无法JSON序列化问题求助
问题原因与解决方案
你遇到的TypeError: Object of type ActionRow is not JSON serializable错误,核心问题出在组件结构的理解偏差上:discord_components要求send方法的components参数接收的是一个ActionRow对象的列表,而你错误地把多个ActionRow嵌套进了另一个父ActionRow里,这种嵌套结构无法被JSON序列化,所以触发了报错。
代码里的具体错误点
- 初始化错误:你把
actionRowOfRows初始化成了ActionRow(),但它应该是一个空列表,用来存储多个独立的ActionRow实例。 - 遗漏最后一组按钮:循环结束后,最后一组不满5个按钮的
buttonRow没有被添加到列表中,会导致Saturday和Sunday的按钮丢失。 - 计数逻辑小问题:新行添加第一个按钮后,
fill被重置为0,会导致后续计数不准确。
修正后的完整代码
# 发送包含所有星期的消息 await message.channel.send("Days of the week.") # 按分类发送消息 actionRowOfRows = [] # 改为空列表,用于存储多个独立的ActionRow buttonRow = [] fill = 0 for day in ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]: if fill < 5: buttonRow.append(Button(style=ButtonStyle.blue, custom_id=day, label=day)) fill += 1 else: # 将当前按钮列表包装为ActionRow实例,添加到行集合 actionRowOfRows.append(ActionRow(*buttonRow)) buttonRow = [] buttonRow.append(Button(style=ButtonStyle.blue, custom_id=day, label=day)) fill = 1 # 已添加一个按钮,计数设为1 # 循环结束后,检查是否还有未提交的按钮行 if buttonRow: actionRowOfRows.append(ActionRow(*buttonRow)) # 发送包含按钮的消息 category_message = await message.channel.send(content="The week", components=actionRowOfRows)
关键修改说明
- 把
actionRowOfRows改为列表类型,用来收集每一行的ActionRow实例,符合discord组件的参数要求。 - 创建
ActionRow时用解包语法*buttonRow,直接把按钮列表传入构造函数,确保结构正确。 - 循环结束后增加判断逻辑,避免最后一组不满5个的按钮被遗漏。
- 修正
fill的重置值,确保计数逻辑准确。
这样修改后,组件结构就完全符合discord的规范了,每个ActionRow是独立的按钮行,components参数接收的是这些行的列表,就能正常完成JSON序列化并发送成功。
内容的提问来源于stack exchange,提问作者100_Mill_RF
相关产品推荐
相关产品推荐

