加油站收据JSON文件存储与读取异常问题求助
问题分析
你当前的问题出在写入逻辑:每次新增收据时,都创建一个仅包含单条收据的List<Receipts>,序列化后直接追加到文件末尾。这导致文件里出现了两个独立的JSON数组([...][...]),不符合JSON语法规范,因此读取时解析器会报错。
解决方案
1. 先修复已损坏的JSON文件
打开你的收据JSON文件,将两个数组中间的][替换为, ,把它们合并成一个合法的数组结构:
[ { "pricePerL": 10.22, "ID": "NH1164DTDE", "amount": 10.0, "tax": 25.5500011, "totalPrice": 102.200005, "time": "01.20.2023 13:12", "sort": "beznin", "typeOfPayment": "card", "employee": "Denis" }, { "ID": "300FIMTU7U", "sort": "disel", "employee": "Denis", "amount": 150.0, "pricePerL": 13.24, "tax": 496.5, "totalPrice": 1986.0, "typeOfPayment": "cash", "time": "01.20.2023 13:19" } ]
2. 修改写入逻辑(核心修复)
不要每次追加新的数组,而是先读取文件中已有的所有收据,将新收据加入后再整体写入:
// 新增收据的方法 void AddReceipt(Receipts newReceipt, string receiptFile) { List<Receipts> allReceipts = new List<Receipts>(); // 如果文件已存在,读取现有数据 if (File.Exists(receiptFile)) { string existingJson = File.ReadAllText(receiptFile); allReceipts = JsonConvert.DeserializeObject<List<Receipts>>(existingJson); } // 添加新收据 allReceipts.Add(newReceipt); // 序列化并覆盖写入文件(注意是WriteAllText,不是Append) string updatedJson = JsonConvert.SerializeObject(allReceipts, Formatting.Indented); File.WriteAllText(receiptFile, updatedJson); }
3. 确保读取逻辑正确
你的读取函数需要先从文件加载数据,再传入遍历:
static void pregledRacuna(string receiptFile) { try { if (!File.Exists(receiptFile)) { Console.WriteLine("收据文件不存在"); return; } string jsonContent = File.ReadAllText(receiptFile); List<Receipts> racuniLista = JsonConvert.DeserializeObject<List<Receipts>>(jsonContent); foreach (Receipts r in racuniLista) { // 输出ID和时间示例 Console.WriteLine($"收据ID: {r.ID}, 时间: {r.time}"); } } catch (Exception e) { Console.WriteLine(e); } }
额外建议
- 如果收据数量很大,读取整个列表可能影响性能,此时可以考虑使用JSON Lines格式(每条收据占一行,无需外层数组),但需要调整读写逻辑。
- 操作文件时建议加锁,避免多线程同时写入导致文件损坏。
内容的提问来源于stack exchange,提问作者krky
相关产品推荐
相关产品推荐

