You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:10:22