Python如何正确更新JSON文件数组内字段值且不破坏原有结构
核心问题说明
你当前的实现存在几个关键问题,会导致修改失效或破坏原文件结构:
- 读取数据时仅截取了
bank_details字段,丢弃了JSON根节点下的其他潜在字段,后续写回时会直接丢失这部分内容 - 仅在内存中修改了数据,未执行文件写回操作,所有修改在程序运行结束后就会消失
- 现有双层遍历逻辑冗余,且未处理目标用户不存在的边界情况,容易触发键错误
正确实现方案
核心原则是读取完整JSON结构、仅修改目标字段、全量写回格式化后的完整数据,全程不会改动无关内容。
1. 修正数据读取逻辑
不要只返回bank_details片段,直接返回完整的JSON根对象,保证所有原有字段都被保留:
import json async def get_bank_data(): with open("bank.json", "r", encoding="utf-8") as f: # 加载完整JSON内容,不做字段裁剪 full_bank_data = json.load(f) return full_bank_data
2. 余额修改+安全写回逻辑
找到目标用户修改对应余额后,将完整的JSON对象写回文件,写回时保持和原文件一致的格式化参数,避免格式错乱:
# 读取完整数据 full_data = await get_bank_data() earnings = int(amt) target_uid = str(author.id) is_user_exist = False # 遍历查找目标用户 for entry in full_data["bank_details"]: if target_uid in entry: # 直接累加钱包余额,无需临时变量中转 entry[target_uid]["wallet"] += earnings is_user_exist = True break # 可选逻辑:如果用户不存在则初始化默认账户,不需要可删除 if not is_user_exist: full_data["bank_details"].append({ target_uid: { "wallet": earnings, "bank": 0 } }) # 全量写回文件,保证其他字段完全不变 with open("bank.json", "w", encoding="utf-8") as f: # indent=4匹配原文件的4空格缩进,ensure_ascii=False避免中文乱码 json.dump(full_data, f, indent=4, ensure_ascii=False)
注意事项
- 写回文件时的
indent参数需要和原文件格式保持一致,你当前的JSON文件使用4空格缩进,传入indent=4即可维持原有排版,不会出现单行压缩的情况 - 如果你的业务存在多进程/多协程同时读写该JSON文件的场景,需要额外加文件锁,避免并发写入导致文件损坏
- 不要尝试用字符串替换的方式修改JSON内容,极易出现语法错误或破坏其他字段结构
内容的提问来源于stack exchange,提问作者iamdum
相关产品推荐
相关产品推荐

