.NET 7中使用FromSqlRaw调用存储过程无法返回目标JSON格式
.NET 7 调用存储过程返回指定JSON格式的解决方法
问题核心
当前控制器直接返回OutputString集合,得到的JSON是数组结构,但需求是外层包含Account字段的对象结构;同时原代码用字符串拼接参数存在SQL注入风险,这两个问题需要同时解决。
解决步骤
1. 修正存储过程调用的参数传递(避免SQL注入)
原代码直接拼接参数的方式存在安全隐患,改用EF Core的参数化查询:
public async Task<ActionResult<AccountResponse>> Getoutput(AccountByCustomer input) { // 使用参数占位符,避免SQL注入 var storedProc = "exec dbo.Get_ACCOUNT_Data_To_API @CustomerNumber, @RequestClass, @EmailAddress, @TransactionId"; // 执行存储过程并获取数据 var accountList = await _context.OutputString .FromSqlRaw(storedProc, input.CustomerNumber, input.RequestClass, input.EmailAddress, input.TransactionId) .ToListAsync();
2. 定义返回结构的包装类
为了得到期望的JSON格式,需要创建一个包含Account数组的包装类:
public class AccountResponse { public List<OutputString> Account { get; set; } }
如果OutputString的属性名和JSON里的字段不匹配(比如类里是CustomerNumber但JSON需要CustomerNo),可以用JsonPropertyName特性做映射:
using System.Text.Json.Serialization; public class OutputString { [JsonPropertyName("Token")] public string Token { get; set; } [JsonPropertyName("CustomerNo")] public string CustomerNumber { get; set; } }
3. 包装数据并返回
将查询到的OutputString集合包装到AccountResponse中,返回给客户端:
// 包装成指定的结构 var response = new AccountResponse { Account = accountList }; return Ok(response); }
4. 验证存储过程返回字段
确保存储过程返回的字段名称和OutputString类的属性(或映射后的名称)一致,否则会出现字段值为空的情况。如果存储过程返回的字段名不同,可以在存储过程中用别名调整,比如:
SELECT Token, CustomerNumber AS CustomerNo FROM ...
这样处理后,接口返回的JSON就会和期望的结构一致:
{ "Account": [ { "Token": "8026F271-34FB-47F9-A465-83E9B0EF99FD", "CustomerNo": "..." } ] }
内容的提问来源于stack exchange,提问作者user2660603
相关产品推荐
相关产品推荐

