Pycord报错TypeError:TextIOWrapper无法JSON序列化问题排查
报错原因及修复方案
核心错误点
混淆
json.load()/json.dump()与json.loads()/json.dumps()的用法json.loads()仅接收字符串作为参数,你却传入了文件对象f(TextIOWrapper类型),这是触发序列化错误的直接原因。读取JSON文件应使用json.load(f),它能直接从文件对象加载数据。json.dumps()是将Python对象转换为JSON字符串,写入文件时应该用json.dump(obj, f),它会直接把对象写入文件对象。
变量名冲突导致逻辑混乱
在setreportchannel函数中,参数channel是discord.TextChannel对象,但你随后用channel = json.load(f)将其覆盖为字典,后续调用channel.id必然报错——字典不存在id属性。保存数据时参数顺序错误
json.dump()的第一个参数是要序列化的Python对象,第二个是文件对象,你完全写反了参数顺序。
修复后的代码
import json import discord from discord.ext import commands def get_channels(guild): try: with open('channels.json','r') as f: # 使用load读取文件对象,而非loads channels = json.load(f) return channels.get(str(guild.id)) except FileNotFoundError: # 首次运行文件不存在时返回None return None @bot.slash_command(name="set-report-channel", description="Set the channel.") async def setreportchannel(ctx, target_channel: discord.TextChannel = None): if not target_channel: await ctx.respond("请指定一个文本频道!") return # 加载现有数据,文件不存在则初始化空字典 try: with open('channels.json','r') as f: channels_data = json.load(f) except FileNotFoundError: channels_data = {} # 存储频道ID,用字符串作为键 channels_data[str(ctx.guild.id)] = target_channel.id # 写入文件,使用dump且参数顺序正确 with open('channels.json','w') as f: json.dump(channels_data, f, indent=4) await ctx.respond(f"报告频道已设置为 {target_channel.mention}")
补充说明
- 新增文件不存在的异常处理,避免首次运行因无文件触发报错。
- 将参数名改为
target_channel,避免和字典变量冲突。 - 用
channels.get(str(guild.id))替代直接索引,防止 guild ID 不存在时抛出KeyError。
内容的提问来源于stack exchange,提问作者Arctic
相关产品推荐
相关产品推荐

