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

WebAPI中StreamWriter无法向JSON文件写入数据问题求助

解决WebAPI中向JSON文件写入Student数据失败的问题

问题根源

  1. 直接写入对象实例:sw.WriteLine(_Student)会输出对象的类型名称(如CRUDAPI.Models.Students),而非JSON格式数据,完全不符合预期。
  2. 错误的文件写入模式:使用FileMode.Append会在原有完整JSON结构末尾直接追加内容,导致整个文件变成无效JSON,无法被正常解析。
  3. 实体类与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:12:23