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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:03:30