文件解析偶发Newtonsoft.Json.JsonReaderException问题求助
解决JSON解析异常与文件占用问题
咱们先理清你遇到的两个问题的根源——其实和字符串插值$符号没啥关系,核心是异步操作未正确等待以及文件流未完全释放导致的:
问题1:JsonReaderException(读取空/不完整JSON)
你调用file.CopyToAsync(stream)时没有加await,这意味着代码会在文件复制还没完成的时候,就直接执行RetrieveModels rm = new RetrieveModels(path)。此时文件里可能是空的或者只有部分JSON内容,自然会触发JArray.Parse的异常——它根本没法从空内容里解析出合法的JArray。
问题2:文件占用异常
当你把RetrieveModels实例化移到复制代码后面,但还是没加await,此时CopyToAsync的异步写入操作还在后台跑,文件流还被占用着。这时候去读取文件,就会触发“文件正被其他进程占用”的错误。
解决办法
1. 正确等待异步文件复制操作
把UploadFile改成异步方法,给CopyToAsync加上await,确保文件完全写入、流彻底释放后,再去解析文件:
public async Task<IActionResult> UploadFile(IFormFile file) { if (file == null || file.Length == 0) return Content("file not selected"); else { var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "processes.json"); using (var stream = new FileStream(path, FileMode.Create)) { // 等待文件复制完成,确保内容全部写入 await file.CopyToAsync(stream); } // 此时using块已经释放了文件流,文件内容完整,可以安全解析 RetrieveModels rm = new RetrieveModels(path); // 后续业务逻辑... return Ok("文件上传并解析成功"); } }
2. 给解析逻辑加一层校验(可选但推荐)
为了避免上传文件本身格式错误导致的异常,可以在RetrieveModels的构造方法里加基础校验:
public RetrieveModels(string path) { string jsonContent = File.ReadAllText(path); // 先检查内容是否为空 if (string.IsNullOrWhiteSpace(jsonContent)) { throw new InvalidOperationException("JSON文件内容为空,请检查上传的文件"); } // 捕获格式异常,给更清晰的错误提示 try { JArray json = JArray.Parse(jsonContent); // 后续逻辑... } catch (JsonReaderException ex) { throw new InvalidOperationException("上传的文件不是合法的JSON数组格式", ex); } }
关于字符串插值$的说明
你怀疑的$符号其实完全没问题——$@"{path}"这种写法是合法的(甚至这里根本没必要用,直接传path就行,因为它已经是完整路径了)。字符串插值本身不会导致文件路径或读取异常,不用纠结这个点。
额外小建议
- 避免直接覆盖
processes.json:可以先把上传的文件存成临时文件,验证格式没问题后再替换目标文件,防止中途出错导致原文件损坏。 - 大文件场景下,异步操作能提升性能,但一定要牢记用
await等待异步任务完成,不然容易踩各种异步相关的“坑”。
内容的提问来源于stack exchange,提问作者Zarif
相关产品推荐
相关产品推荐

