Discord.py修改现有JSON添加新参数失败:无报错但JSON未更新
Discord机器人商店更新命令问题排查与修复
问题分析
执行update_shop命令后无报错,但JSON文件未更新、未收到提示消息,核心问题有以下几点:
- 未遍历所有用户:原代码仅尝试修改单个用户的物品栏,但
user变量未定义,导致if条件永远不成立,直接跳过更新逻辑。 - 变量未定义:代码中使用
user.id但未声明user对象,触发更新的逻辑根本无法执行。 - 权限配置存疑:
@commands.has_role("*")的写法不符合Discord.py的权限校验规则,若执行命令的用户不满足权限,命令会静默失败(取决于机器人的错误处理配置)。
修正后的代码
@commands.hybrid_command(name="update_shop", description="管理员命令:更新商店时同步所有用户的物品栏!") @commands.has_role("管理员") # 替换为实际的管理员角色名称/ID async def update_shop(self, ctx: commands.Context) -> None: try: # 读取inventory.json文件 with open("cogs/inventory.json", "r") as f: inventory = json.load(f) # 遍历所有用户ID,为每个用户添加law_tuition字段并设为0 for user_id in inventory: if "law_tuition" not in inventory[user_id]: inventory[user_id]["law_tuition"] = 0 # 写入更新后的内容,indent参数让JSON格式更易读 with open("cogs/inventory.json", "w") as f: json.dump(inventory, f, indent=4) await ctx.send("所有用户物品栏已同步完成!") except FileNotFoundError: await ctx.send("错误:未找到inventory.json文件!") except json.JSONDecodeError: await ctx.send("错误:inventory.json文件格式无效!") except Exception as e: await ctx.send(f"执行出错:{str(e)}")
额外注意事项
- JSON键格式:从你提供的JSON示例看,用户ID的键存在格式异常(开头有左括号),需确保所有用户ID都是纯字符串格式(如
"123456789"),否则遍历和修改会出问题。 - 权限校验:
@commands.has_role("*")无法正确匹配角色,需替换为实际的管理员角色名称或角色ID,确保只有权限用户能执行命令。 - 文件路径:确认
cogs/inventory.json的路径正确,机器人有权限读写该文件。
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

