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

discord.py 如何一次性为所有用户添加新的JSON键

解决Discord机器人JSON用户数据添加新键的问题

首先得指出你代码里的核心问题:当用户已存在于JSON文件中时,你只把house这个单独的布尔值False写入了文件,这直接破坏了整个JSON的结构,自然达不到添加新键的效果。下面是修复后的方案:

修复后的open_account函数

import json
async def open_account(user):
    users = await get_bank_data()
    user_id = str(user.id)
    
    if user_id in users:
        # 先检查用户是否已有House键,避免重复赋值
        if "House" not in users[user_id]:
            users[user_id]["House"] = False
            # 必须把完整的users字典写入文件,而非单个值
            with open("main.json", 'w') as f:
                json.dump(users, f, indent=4)  # indent让JSON格式更易读
        return False
    else:
        users[user_id] = {
            "wallet": 0,
            "bank": 0,
            "House": False
        }
        with open("main.json", 'w') as f:
            json.dump(users, f, indent=4)
        return True

额外:批量为所有现有用户添加House键

如果你想一次性给所有已存在的用户都补上House: False(不用等用户触发open_account),可以单独写个处理函数:

async def batch_add_house_key():
    users = await get_bank_data()
    has_update = False
    for uid in users:
        if "House" not in users[uid]:
            users[uid]["House"] = False
            has_update = True
    if has_update:
        with open("main.json", 'w') as f:
            json.dump(users, f, indent=4)
        print("已为所有用户添加House键")
    else:
        print("所有用户都已拥有House键,无需更新")

错误原因拆解

你之前用f.write(json.dumps(house))的操作,相当于把单个布尔值false覆盖了整个JSON文件,导致后续get_bank_data读取时根本无法得到正确的用户字典结构。记住:操作JSON用户数据时,始终要基于完整的users字典进行修改,最后再把整个字典写入文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:02:36