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

使用discord.py开发等级系统时遭遇JSONDecodeError错误求助

关于Discord机器人等级系统的JSON解码错误问题

我为Discord机器人开发等级系统,参考了Stack Overflow上的基础实现方案,创建了level.json文件后运行代码,触发错误:
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

尝试多种修复方法均无效,附上代码求助:

@bot.event
async def on_message(message):
    if not message.author.bot:
        print('function load')
        with open('level.json','r') as f:
            users = json.load(f)
            print('file load')
        await update_data(users, message.author,message.guild)
        await add_experience(users, message.author, 4, message.guild)
        await level_up(users, message.author,message.channel, message.guild)

        with open('level.json','w') as f:
            json.dump(users, f)
    await bot.process_commands(message)

async def update_data(users, user,server):
    if not str(server.id) in users:
        users[str(server.id)] = {}
        if not str(user.id) in users[str(server.id)]:
            users[str(server.id)][str(user.id)] = {}
            users[str(server.id)][str(user.id)]['experience'] = 0
            users[str(server.id)][str(user.id)]['level'] = 1
    elif not str(user.id) in users[str(server.id)]:
            users[str(server.id)][str(user.id)] = {}
            users[str(server.id)][str(user.id)]['experience'] = 0
            users[str(server.id)][str(user.id)]['level'] = 1

async def add_experience(users, user, exp, server):
  users[str(user.guild.id)][str(user.id)]['experience'] += exp

async def level_up(users, user, channel, server):
  experience = users[str(user.guild.id)][str(user.id)]['experience']
  lvl_start = users[str(user.guild.id)][str(user.id)]['level']
  lvl_end = int(experience ** (1/4))
  if str(user.guild.id) != '757383943116030074':
    if lvl_start < lvl_end:
      await channel.send('{} has leveled up to Level {}'.format(user.mention, lvl_end))
      users[str(user.guild.id)][str(user.id)]['level'] = lvl_end

@bot.command(aliases = ['rank','lvl'])
async def level(ctx,member: discord.Member = None):
    if not member:
        user = ctx.message.author
        with open('level.json','r') as f:
            users = json.load(f)
        lvl = users[str(ctx.guild.id)][str(user.id)]['level']
        exp = users[str(ctx.guild.id)][str(user.id)]['experience']

        embed = discord.Embed(title = 'Level {}'.format(lvl), description = f"{exp} XP " ,color = discord.Color.green())
        embed.set_author(name = ctx.author, icon_url = ctx.author.avatar_url)
        await ctx.send(embed = embed)
    else:
      with open('level.json','r') as f:
          users = json.load(f)
      lvl = users[str(ctx.guild.id)][str(member.id)]['level']
      exp = users[str(ctx.guild.id)][str(member.id)]['experience']
      embed = discord.Embed(title = 'Level {}'.format(lvl), description = f"{exp} XP" ,color = discord.Color.green())
      embed.set_author(name = member, icon_url = member.avatar_url)

      await ctx.send(embed = embed)

问题原因及修复方案

  1. 空JSON文件引发解码失败
    新创建的level.json是空白文件,json.load()无法解析空内容。两种解决方式:

    • 手动打开level.json,写入{}后保存;
    • 在代码中添加自动初始化逻辑,替换原读取文件的代码:
      import os
      import json
      
      def get_users():
          # 检查文件是否存在或为空
          if not os.path.exists('level.json') or os.path.getsize('level.json') == 0:
              with open('level.json', 'w') as f:
                  json.dump({}, f)  # 初始化空字典
          with open('level.json', 'r') as f:
              return json.load(f)
      
      之后在需要读取用户数据的地方,用users = get_users()替代原json.load(f)的代码块。
  2. 变量名统一优化
    add_experience和level_up函数中使用user.guild.id,但update_data里用的是server.id,虽然逻辑一致,但建议统一变量名,比如都用guild代替server,避免后续维护混淆。

  3. 升级曲线调整(可选)
    当前lvl_end = int(experience ** (1/4))的升级节奏过快,可根据需求修改公式,比如lvl_end = int((experience / 100) ** 0.5),让等级提升更平缓。

  4. 异常捕获增强
    在读取JSON时添加异常处理,避免因文件损坏导致机器人崩溃:

    def get_users():
        try:
            with open('level.json', 'r') as f:
                return json.load(f)
        except (json.JSONDecodeError, FileNotFoundError):
            # 文件损坏或不存在时初始化空字典
            with open('level.json', 'w') as f:
                json.dump({}, f)
            return {}
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:07:07