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

如何使用Newtonsoft.Json向现有文件追加字典键值对而不覆盖原有内容

问题根因

你当前代码出现数据覆盖的核心原因有两点:

  • 每次新增条目时没有先读取本地Balances.txt中已存储的历史余额数据,直接往空列表vals3里添加新条目
  • File.CreateText本身是覆盖创建文件的逻辑,会直接清空文件原有内容

注意:JSON是结构化格式,不能直接用文件追加流向现有JSON内容后拼接新数据,会导致整个JSON结构非法,无法后续反序列化读取。正确做法是先加载全量旧数据,加入新条目后再整体写入覆盖即可。


完整实现代码

string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Balances.txt");
List<KeyValuePair<string, float>> vals3 = new List<KeyValuePair<string, float>>();

// 第一步:加载已存储的历史数据
if (File.Exists(filePath))
{
    string existingJson = File.ReadAllText(filePath);
    // 兼容文件为空、内容损坏的异常场景
    if (!string.IsNullOrWhiteSpace(existingJson))
    {
        try
        {
            vals3 = JsonConvert.DeserializeObject<List<KeyValuePair<string, float>>>(existingJson) ?? new List<KeyValuePair<string, float>>();
        }
        catch
        {
            // 文件内容损坏时初始化空列表,可根据业务需求补充异常提示逻辑
            vals3 = new List<KeyValuePair<string, float>>();
        }
    }
}

// 第二步:添加当前新条目
string BankWithAccount = BankList.Text + AccountNotextBox1.Text;
float balance = float.Parse(BalanceTxtBox.Text);
vals3.Add(new KeyValuePair<string, float>(BankWithAccount, balance));

// 第三步:将包含历史+新数据的全量列表写入文件
using (StreamWriter sw = File.CreateText(filePath))
{
    // 加Formatting.Indented生成格式化的JSON,方便人工查看内容
    string json = JsonConvert.SerializeObject(vals3, Formatting.Indented);
    sw.Write(json);
}

可选优化点

  • 将float.Parse替换为float.TryParse,避免用户输入非数字内容时程序直接崩溃
  • 如果业务支持同一账号重复录入余额,可以在添加新条目前先判断列表中是否已存在相同Key,存在则更新对应Value,不存在再新增条目,避免同一个银行账号出现多条记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 01:57:02