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

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!")

关键修复点说明

  1. 替换ctx为message.channel:on_message事件没有ctx对象,需要通过message.channel.send()来发送消息;
  2. 用服务器ID作为键:服务器名称可能重复,但ID是全局唯一的,彻底避免数据冲突;
  3. 处理文件为空/不存在的情况:读取文件时先判断内容是否为空,同时捕获FileNotFoundError来初始化空字典;
  4. 删除无效嵌套循环:原代码里的for m in data[guildset]:完全无效(当时列表是空的),直接改为遍历成员添加数据;
  5. 过滤机器人账号:避免把Bot自身或其他机器人加入到成员数据中;
  6. 存储成员ID:用户名可能被修改,ID是永久唯一的,更适合作为身份标识;
  7. 使用具体异常捕获:代替裸except,避免隐藏其他未知错误,方便后续调试。

额外建议

  • 每次写入JSON时用indent=4格式化输出,方便你手动查看和调试数据;
  • 如果Bot的并发量较高,可以考虑使用aiofiles异步读写文件,避免阻塞事件循环(小型Bot用同步读写足够)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:07:53