TypeError: Message 类型的对象不是 JSON 可序列化的 |不和谐.py

Posted

技术标签:

【中文标题】TypeError: Message 类型的对象不是 JSON 可序列化的 |不和谐.py【英文标题】:TypeError: Object of type Message is not JSON serializable | discord.py 【发布时间】:2021-10-16 10:54:27 【问题描述】:

我正在为我的 discord 机器人创建 autovc 命令,但遇到了一些错误。 代码:

@client.command()
async def autovc(ctx):
    def check(message):
        return message.author == ctx.author
    await ctx.send("Please enter the channel name you want to create?")
    c_name= await client.wait_for('message', check=check)
    await ctx.send("What would be the channel user limit?")
    c_limit= int((await client.wait_for('message', check=check)).content)
    await ctx.send("Please Enter the Category ID in which tha channel will be created.")
    guild = client.get_guild(852866665371926588)
    ctg= discord.utils.get(guild.categories, id=(int((await client.wait_for('message', check=check)).content)))
    await guild.create_voice_channel(name= c_name, category= ctg, user_limit= c_limit)

错误:

文件 "C:\Users\illus\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\core.py", 第 85 行,包裹 ret = await coro(*args, **kwargs) 文件“d:\BOT\test.py”,第 30 行,在 autovc 中 await guild.create_voice_channel(name= c_name, category= ctg, user_limit= c_limit)

文件 "C:\Users\illus\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\guild.py", 第 987 行,在 create_voice_channel 中 data = await self.create_channel(name, overwrites, ChannelType.voice, category, reason=reason, **options) 文件 "C:\Users\illus\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\http.py", 第 156 行,应要求提供 kwargs['data'] = utils.to_json(kwargs.pop('json')) 文件 "C:\Users\illus\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\utils.py ", 第 328 行,在 to_json 中 返回 json.dumps(obj, separators=(',', ':'), ensure_ascii=True) 文件 "C:\Users\illus\AppData\Local\Programs\Python\Python39\lib\json_init.py", 第 234 行,在转储中 返回 cls( 文件 "C:\Users\illus\AppData\Local\Programs\Python\Python39\lib\json\encoder.py", 第 199 行,在编码中 chunks = self.iterencode(o, _one_shot=True) 文件 "C:\Users\illus\AppData\Local\Programs\Python\Python39\lib\json\encoder.py", 第 257 行,在 iterencode 中 return _iterencode(o, 0) 文件 "C:\Users\illus\AppData\Local\Programs\Python\Python39\lib\json\encoder.py", 第 179 行,默认 raise TypeError(f'Object of type o.class.name '

TypeError: Message 类型的对象不是 JSON 可序列化的

上述异常是以下异常的直接原因:

Traceback(最近一次调用最后一次):文件 "C:\Users\illus\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\bot.py", 第 939 行,调用中 等待 ctx.command.invoke(ctx) 文件“C:\Users\illus\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\core.py”, 第 863 行,在调用中 等待注入(*ctx.args,**ctx.kwargs)文件“C:\Users\illus\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\core.py”, 第 94 行,包裹 从 exc discord.ext.commands.errors.CommandInvokeError 引发 CommandInvokeError(exc):命令引发 异常:TypeError:Message 类型的对象不是 JSON 可序列化的

【问题讨论】:

初始异常的回溯是什么? 更新了!我会把整个终端输出放在那里。 我建议直接使用命令输入所需的参数(频道名称、类别 ID、用户限制),如下所示:async def autovc(ctx, c_name: str, c_categid: int, c_limit: int): 【参考方案1】:

我认为这是因为您尝试使用 message 对象而不是 string 命名您的 vc。不要将c_name 设置为name 参数,而是尝试使用c_name.content,这样您就可以获得消息的实际内容。像这样:

await guild.create_voice_channel(name=c_name.content, category=ctg, user_limit=c_limit)

我还没有测试过,但我很确定这是问题所在。

【讨论】:

以上是关于TypeError: Message 类型的对象不是 JSON 可序列化的 |不和谐.py的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:预期的 float32,得到的列表包含类型为“_Message”的张量

Tensorflow Slim:TypeError:预期 int32,得到的列表包含类型为“_Message”的张量

TypeError:'bool' 对象不可迭代

TypeError:“_asyncio.Future”对象不可下标,使用 mongodb 的异步电机驱动程序

TypeError:不理解数据类型“列表”

类型错误:on_message() 缺少 1 个必需的位置参数:“消息”