C# WinForms中如何向JSON文件追加数据?使用Newtonsoft遇阻
用Newtonsoft.Json给JSON文件追加数据的解决方案
嗨,我明白你想给现有的JSON数组追加新的Smoothie数据,之前用Newtonsoft没成功对吧?别担心,咱们一步步来搞定这个问题。
首先要明确:直接往JSON文件末尾写新的对象字符串会破坏JSON的结构(原文件是数组格式),正确的做法是先读取并解析现有数据,添加新对象后再重新序列化写回文件。
步骤1:补全你的实体类
先把Smoothie类补全,确保和JSON里的所有字段对应:
public class Smoothie { public string Name { get; set; } public string Calories { get; set; } public string Country { get; set; } public int Longtitude { get; set; } // 和JSON字段名保持一致,注意拼写 public int Latitude { get; set; } }
步骤2:完整的追加数据代码示例
下面是可直接使用的全流程代码,包含读取现有数据、添加新对象、写回文件的完整逻辑:
using Newtonsoft.Json; using System.Collections.Generic; using System.IO; class Program { static void Main(string[] args) { // 替换成你的JSON文件实际路径 string jsonFilePath = @"C:\your-folder\smoothies.json"; // 1. 读取并解析现有数据,处理文件不存在或为空的情况 List<Smoothie> smoothies = new List<Smoothie>(); if (File.Exists(jsonFilePath)) { string existingJson = File.ReadAllText(jsonFilePath); // 反序列化为对象集合,为空时初始化新列表 smoothies = JsonConvert.DeserializeObject<List<Smoothie>>(existingJson) ?? new List<Smoothie>(); } // 2. 创建要追加的新Smoothie对象 var newSmoothie = new Smoothie { Name = "Mango", Calories = "60,1", Country = "Asia", Longtitude = 54321, Latitude = 98765 }; // 3. 将新对象添加到集合中 smoothies.Add(newSmoothie); // 4. 序列化回格式化后的JSON字符串(带缩进,方便阅读) string updatedJson = JsonConvert.SerializeObject(smoothies, Formatting.Indented); // 5. 写回JSON文件 File.WriteAllText(jsonFilePath, updatedJson); } }
关键要点解释
- 为什么不能直接追加字符串? 原JSON是标准数组格式
[ {...}, {...} ],如果直接把{...}写到文件末尾,会变成[ {...}, {...} ]{...},这是非法JSON,无法被正常解析。必须先把整个数组转换成对象集合,添加新元素后再重新生成合法的JSON结构。 - 异常场景处理:代码里判断了文件是否存在,避免了文件不存在时反序列化报错的问题;同时处理了反序列化结果为空的情况,保证程序稳定性。
- 字段匹配注意:实体类的属性名要和JSON里的键完全一致(Newtonsoft默认大小写不敏感,但保持一致能避免不必要的问题),比如你JSON里的
Longtitude拼写,实体类也要对应。
如果之前尝试失败,大概率是直接往文件里追加字符串导致的结构错误,用上面的方法就能解决啦!
内容的提问来源于stack exchange,提问作者Sylent
相关产品推荐
相关产品推荐

