使用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)
问题原因及修复方案
空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)的代码块。
- 手动打开
变量名统一优化
add_experience和level_up函数中使用user.guild.id,但update_data里用的是server.id,虽然逻辑一致,但建议统一变量名,比如都用guild代替server,避免后续维护混淆。升级曲线调整(可选)
当前lvl_end = int(experience ** (1/4))的升级节奏过快,可根据需求修改公式,比如lvl_end = int((experience / 100) ** 0.5),让等级提升更平缓。异常捕获增强
在读取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
相关产品推荐
相关产品推荐

