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

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)

关键修改说明

  1. 把actionRowOfRows改为列表类型,用来收集每一行的ActionRow实例,符合discord组件的参数要求。
  2. 创建ActionRow时用解包语法*buttonRow,直接把按钮列表传入构造函数,确保结构正确。
  3. 循环结束后增加判断逻辑,避免最后一组不满5个的按钮被遗漏。
  4. 修正fill的重置值,确保计数逻辑准确。

这样修改后,组件结构就完全符合discord的规范了,每个ActionRow是独立的按钮行,components参数接收的是这些行的列表,就能正常完成JSON序列化并发送成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:17:34