Discord机器人JSON操作代码报错,请求排查解决
排查并修复Discord Bot的JSON与逻辑错误
让我们一步步拆解你遇到的问题,先解决报错,再优化代码逻辑:
错误1:SyntaxError: invalid syntax(else语句)
你提到第58行有else语句的语法错误,但你提供的代码片段里没有对应的else块,大概率是代码粘贴时遗漏了,或者else的缩进不符合Python规范。我们先把现有代码的核心问题修复后,这个语法问题也会同步解决。
错误2:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
这个错误的核心原因有两个:
- 当
users.json不存在时,第一次用r模式打开会报错进入except,但你的except块只处理了文件存在的情况,完全没覆盖文件不存在的场景; - 如果文件存在但内容为空,
json.load无法解析空内容,直接抛出解码错误。
完整修复后的代码
下面是修复所有问题后的代码,我添加了详细注释说明每个修复点:
import json from os.path import isfile @client.event async def on_message(message): if message.content.startswith("setup"): # 初始化数据字典,默认是空的 data = {} # 用服务器ID作为键,比名称更唯一可靠(服务器名称可能重复) guild_id = str(message.guild.id) try: # 尝试读取现有JSON文件 with open("users.json", "r") as json_file: # 先处理文件为空的情况 file_content = json_file.read().strip() if file_content: data = json.loads(file_content) else: data = {} # 检查当前服务器是否已经完成过初始化 if guild_id in data: # on_message事件没有ctx对象,用message.channel发送消息 await message.channel.send("Setup has done already!") return except FileNotFoundError: # 如果文件不存在,直接初始化空字典 data = {} # 初始化当前服务器的成员列表 data[guild_id] = [] # 遍历服务器所有成员,添加初始数据 for member in message.guild.members: # 跳过机器人账号,避免无效数据 if member.bot: continue # 存储成员ID(比用户名更可靠,用户名可修改)和初始属性 data[guild_id].append({ "member_id": str(member.id), "username": member.name, "money": 0, "count": 0, "other": 0 }) # 将数据写入JSON文件,indent参数让输出更易读 with open("users.json", "w") as outfile: json.dump(data, outfile, indent=4) await message.channel.send("Setup completed successfully!")
关键修复点说明
- 替换
ctx为message.channel:on_message事件没有ctx对象,需要通过message.channel.send()来发送消息; - 用服务器ID作为键:服务器名称可能重复,但ID是全局唯一的,彻底避免数据冲突;
- 处理文件为空/不存在的情况:读取文件时先判断内容是否为空,同时捕获
FileNotFoundError来初始化空字典; - 删除无效嵌套循环:原代码里的
for m in data[guildset]:完全无效(当时列表是空的),直接改为遍历成员添加数据; - 过滤机器人账号:避免把Bot自身或其他机器人加入到成员数据中;
- 存储成员ID:用户名可能被修改,ID是永久唯一的,更适合作为身份标识;
- 使用具体异常捕获:代替裸
except,避免隐藏其他未知错误,方便后续调试。
额外建议
- 每次写入JSON时用
indent=4格式化输出,方便你手动查看和调试数据; - 如果Bot的并发量较高,可以考虑使用
aiofiles异步读写文件,避免阻塞事件循环(小型Bot用同步读写足够)。
内容的提问来源于stack exchange,提问作者MrStretch
相关产品推荐
相关产品推荐

