WebAPI中StreamWriter无法向JSON文件写入数据问题求助
解决WebAPI中向JSON文件写入Student数据失败的问题
问题根源
- 直接写入对象实例:
sw.WriteLine(_Student)会输出对象的类型名称(如CRUDAPI.Models.Students),而非JSON格式数据,完全不符合预期。 - 错误的文件写入模式:使用
FileMode.Append会在原有完整JSON结构末尾直接追加内容,导致整个文件变成无效JSON,无法被正常解析。 - 实体类与JSON字段不匹配:JSON中的根字段是
Students(大写开头),但实体类Students的属性是students(小写开头),序列化/反序列化时会出现字段映射错误。
解决方案
1. 修正实体类(或配置序列化规则)
将实体类的属性名与JSON字段名统一,避免映射错误:
public class Student { public int Id { get; set; } public string Name { get; set; } public string Department { get; set; } } public class Students { // 改为大写开头,与JSON中的"Students"字段匹配 public List<Student> Students { get; set; } }
如果不想修改类名,可在序列化时配置忽略大小写(如使用System.Text.Json的JsonSerializerOptions.PropertyNameCaseInsensitive = true)。
2. 正确的JSON读写流程
不要直接追加文件,需遵循「读取原有数据→添加新内容→覆盖写入」的流程,同时使用JSON序列化库处理对象:
使用Newtonsoft.Json的实现(需先通过NuGet安装Newtonsoft.Json)
[Route("api/[controller]")] [ApiController] public class StudentsController : ControllerBase { [HttpPost] public IActionResult Add(Students incomingStudents) { var filePath = "C:/Users/tanmay_pawar/source/repos/CRUDAPI/CRUDAPI/people.json"; // 读取原有JSON内容 var existingJson = System.IO.File.ReadAllText(filePath); // 反序列化为Students对象 var studentsData = Newtonsoft.Json.JsonConvert.DeserializeObject<Students>(existingJson); // 添加新学生数据到原有列表 if (incomingStudents.Students != null && incomingStudents.Students.Any()) { studentsData.Students.AddRange(incomingStudents.Students); } // 重新序列化为格式化的JSON var updatedJson = Newtonsoft.Json.JsonConvert.SerializeObject(studentsData, Newtonsoft.Json.Formatting.Indented); // 覆盖写入文件 System.IO.File.WriteAllText(filePath, updatedJson); return Ok("学生数据添加成功"); } }
使用System.Text.Json的实现(.NET Core 3.0+内置)
using System.Text.Json; [Route("api/[controller]")] [ApiController] public class StudentsController : ControllerBase { [HttpPost] public IActionResult Add(Students incomingStudents) { var filePath = "C:/Users/tanmay_pawar/source/repos/CRUDAPI/CRUDAPI/people.json"; var serializerOptions = new JsonSerializerOptions { WriteIndented = true, PropertyNameCaseInsensitive = true // 忽略大小写匹配字段 }; // 读取并反序列化原有数据 var existingJson = System.IO.File.ReadAllText(filePath); var studentsData = JsonSerializer.Deserialize<Students>(existingJson, serializerOptions); // 添加新学生 if (incomingStudents.Students != null && incomingStudents.Students.Any()) { studentsData.Students.AddRange(incomingStudents.Students); } // 序列化并覆盖写入 var updatedJson = JsonSerializer.Serialize(studentsData, serializerOptions); System.IO.File.WriteAllText(filePath, updatedJson); return Ok("学生数据添加成功"); } }
额外注意事项
- 确保应用程序对目标JSON文件拥有读写权限,避免因权限不足导致写入失败。
- 若存在并发写入场景,需添加文件锁或改用数据库等更可靠的存储方案,防止文件损坏。
- 前端传入的请求体需符合格式要求,示例:
{ "Students": [ { "Id": 7, "Name": "NewStudent", "Department": "Admin" } ] }
内容的提问来源于stack exchange,提问作者Tanmay Pawar
相关产品推荐
相关产品推荐

