ASP.NET CORE WEB API调用存储过程返回JSON为空如何解决
解决方案
你的代码存在重复序列化的冗余逻辑,同时大概率是ASP.NET Core默认序列化器和Newtonsoft.Json的兼容问题导致响应为空,按以下步骤调整即可:
步骤1:确认项目配置了Newtonsoft.Json支持
ASP.NET Core 3.0+ 默认使用System.Text.Json作为序列化器,不会自动识别Newtonsoft.Json的JObject/JArray类型,需要先手动添加Newtonsoft.Json的支持:
- 先安装NuGet包
Microsoft.AspNetCore.Mvc.NewtonsoftJson - 在Program.cs(.NET 6+)或Startup.cs的服务注册代码中添加配置:
builder.Services.AddControllers() .AddNewtonsoftJson();
步骤2:优化接口代码,去掉冗余序列化逻辑
你原来的代码把DataTable转成JSON字符串又反序列化,属于重复操作,直接返回转好的JSON字符串或者直接返回DataTable都可以,推荐两种写法选一种即可:
写法1:直接返回序列化好的JSON字符串
[HttpGet] public IActionResult GetTodoItem() { try { DbConnect dbConnect = new DbConnect(); DataSet ds = dbConnect.ExecuteSP2("View_Contacts"); // 直接返回JSON字符串,指定content-type为application/json string jsonResult = dbConnect.DataTableToJSONWithJSONNet(ds.Tables[0]); return Content(jsonResult, "application/json"); } catch (Exception ex) { return StatusCode(500, ex.Message); } }
写法2:直接返回DataTable,交给序列化器处理
如果你的DataTableToJSONWithJSONNet方法没有特殊自定义逻辑,完全可以省略自己转JSON的步骤,让框架自动序列化:
[HttpGet] public IActionResult GetTodoItem() { try { DbConnect dbConnect = new DbConnect(); DataSet ds = dbConnect.ExecuteSP2("View_Contacts"); return Ok(ds.Tables[0]); } catch (Exception ex) { return StatusCode(500, ex.Message); } }
这种写法需要在上面的AddNewtonsoftJson配置里加上DataTable序列化的支持,配置如下:
builder.Services.AddControllers() .AddNewtonsoftJson(opt => { // 支持DataTable序列化 opt.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.DataTableConverter()); // 空值处理配置,和你预期的格式对齐 opt.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include; });
排查验证建议
如果修改后还是返回空,先加断点确认两个点:
ds.Tables[0]是否有数据,行数是否大于0- 调用
DataTableToJSONWithJSONNet生成的results变量值是否和你预期的JSON样例一致
内容的提问来源于stack exchange,提问作者Joel Abraham
相关产品推荐
相关产品推荐

