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

Python如何正确更新JSON文件数组内字段值且不破坏原有结构

核心问题说明

你当前的实现存在几个关键问题,会导致修改失效或破坏原文件结构:

  1. 读取数据时仅截取了bank_details字段,丢弃了JSON根节点下的其他潜在字段,后续写回时会直接丢失这部分内容
  2. 仅在内存中修改了数据,未执行文件写回操作,所有修改在程序运行结束后就会消失
  3. 现有双层遍历逻辑冗余,且未处理目标用户不存在的边界情况,容易触发键错误
正确实现方案

核心原则是读取完整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:31:11