.NET Core 6 Web API调用SQL Server存储过程返回规范JSON适配Angular
解决.NET 6 Web API返回带转义JSON的问题
1. 核心问题原因
你现在的API是把存储过程返回的jsonResponse字段(本身就是JSON字符串)当成普通字符串序列化了一遍,所以出现转义字符,还被包裹在对象里。要解决就是跳过二次序列化,直接返回存储过程生成的原始JSON数组。
2. 具体实现步骤
步骤1:调用存储过程获取原始JSON字符串
用ADO.NET或者EF Core调用存储过程,提取出jsonResponse字段的内容:
// 用ADO.NET的示例(更直接控制结果) using var conn = new SqlConnection(Configuration.GetConnectionString("YourDbConn")); await conn.OpenAsync(); using var cmd = new SqlCommand("YourProcName", conn) { CommandType = CommandType.StoredProcedure }; cmd.Parameters.AddWithValue("@Id", targetId); using var reader = await cmd.ExecuteReaderAsync(); string rawJson = null; if (await reader.ReadAsync()) { rawJson = reader.GetString(reader.GetOrdinal("jsonResponse")); }
步骤2:直接返回原始JSON(两种可选方式)
方式一:解析为强类型对象返回(推荐,类型安全)
先定义和目标JSON匹配的实体类:
// 示例实体,根据你的JSON结构调整 public class ParentDto { public int Id { get; set; } public string Title { get; set; } public List<ChildDto> Items { get; set; } } public class ChildDto { public int ChildId { get; set; } public string Content { get; set; } }
然后解析并返回:
var result = JsonSerializer.Deserialize<List<ParentDto>>(rawJson); return Ok(result);
这样ASP.NET Core会把对象序列化为干净的JSON数组,没有转义。
方式二:直接输出原始JSON字符串(无需定义实体)
如果不想写实体类,直接告诉API输出原始JSON内容:
return Content(rawJson, "application/json");
这种方式会跳过框架的自动序列化,直接把存储过程生成的JSON返回给前端。
步骤3:避坑提醒
别直接返回包含jsonResponse字段的对象,比如如果用EF Core的FromSqlRaw映射到一个类,直接返回这个类的话,框架会把jsonResponse里的JSON字符串再次序列化,导致转义字符出现。必须先提取出里面的原始JSON内容再处理。
3. 验证效果
处理后API返回的JSON应该和你Angular里的硬编码格式完全一致,比如:
[ { "Id": 1, "Title": "示例父项1", "Items": [ {"ChildId": 101, "Content": "子项1"}, {"ChildId": 102, "Content": "子项2"} ] } ]
可以直接替换Angular里的硬编码数据使用。
内容的提问来源于stack exchange,提问作者HALO
相关产品推荐
相关产品推荐

