如何使用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
相关产品推荐
相关产品推荐

