Asp.NET Core控制器解析JSON文件遇Newtonsoft.Json.JsonReaderException报错
解决JSON解析异常的方案
1. 修复属性大小写不匹配问题
你的模型类DrawInfo中属性coordinates是小写开头,但JSON里的键是Coordinates(大写C),Newtonsoft.Json默认区分大小写,会导致序列化/反序列化时无法匹配。可以通过两种方式解决:
- 方式一:给模型属性添加特性指定对应JSON键名
namespace WebUygAPI.Models { public class DrawInfo { public string username { get; set; } public string number { get; set; } [JsonProperty("Coordinates")] public string coordinates { get; set; } } }
- 方式二:配置Newtonsoft.Json忽略大小写
var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var drawInfos = JsonConvert.DeserializeObject<List<DrawInfo>>(o1, settings);
2. 处理文件编码导致的隐藏字符问题
如果JSON文件带有UTF-8 BOM(字节顺序标记),会触发“unexpected character”错误。修改StreamReader的编码参数,明确指定不含BOM的UTF-8编码:
using (StreamReader file = new StreamReader(filePath, new UTF8Encoding(false))) { string o1 = await file.ReadToEndAsync(); // 后续解析逻辑 }
同时建议使用异步读取方法ReadToEndAsync,匹配控制器的async Task定义。
3. 完善解析代码并捕获详细错误
你的控制器目前仅读取了文件内容,未执行解析操作。添加解析逻辑并捕获详细异常,方便定位问题:
[HttpGet] [Route("GetDraws")] public async Task<IActionResult> get() { string filePath = @"C:\Users\Casper\source\repos\WebUygAPI\WebUygAPI\LineData.json"; try { using (StreamReader file = new StreamReader(filePath, new UTF8Encoding(false))) { string o1 = await file.ReadToEndAsync(); var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var drawInfos = JsonConvert.DeserializeObject<List<DrawInfo>>(o1, settings); return Ok(drawInfos); } } catch (JsonReaderException ex) { return BadRequest($"JSON解析错误:{ex.Message},位置:{ex.LineNumber}:{ex.LinePosition}"); } catch (Exception ex) { return BadRequest($"读取或解析失败:{ex.Message}"); } }
4. 验证JSON格式合法性
将读取到的o1内容复制到本地文本编辑器,检查是否存在不可见的特殊字符;也可以用本地JSON验证工具确认格式是否完全合规。
内容的提问来源于stack exchange,提问作者Onur Bozkurt
相关产品推荐
相关产品推荐

