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

ASP.NET MVC Web API中如何解析SQL存储过程返回的JSON字符串

异常原因
  • 核心原因是SQL Server FOR JSON返回结果被截断:SQL Server 用FOR JSON语句返回JSON字符串时,若结果长度超过2033个字符,会自动将结果拆分为多行存储在返回结果集中,每行最多存储2033个字符。你当前代码只读取了结果集第一行的内容ds.Tables[0].Rows[0][0],没有拼接后续行的剩余内容,导致拿到的JSON字符串不完整,因此反序列化时会报「未终止字符串」的错误。你贴出的示例JSON只是单分类的小体量返回结果,实际运行时多分类数据总长度超过阈值,就会触发该问题。
  • 次要排查点:存储过程存在语法笔误,你写的BeginSelect缺少空格,应修正为BEGIN SELECT避免执行异常。
修复方案

1. 基础修复(适配你现有逻辑)

拼接结果集所有行的内容,得到完整的JSON字符串后再做后续处理:

public object SQLJSONPract()
{
    try
    {
        cmd.CommandText = "usp_JsonPract";
        SqlDataAdapter adp = new SqlDataAdapter(cmd);
        adp.Fill(ds);
        // 拼接所有行的JSON片段,解决截断问题
        StringBuilder jsonSb = new StringBuilder();
        foreach (DataRow row in ds.Tables[0].Rows)
        {
            jsonSb.Append(row[0].ToString());
        }
        string fullJson = jsonSb.ToString();
        object result = JsonConvert.DeserializeObject(fullJson);
        return result;
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
}

2. 更优透传方案

你的需求是直接将数据库返回的JSON透传给客户端,完全不需要做「反序列化→再由框架序列化」的冗余操作,直接返回原生JSON字符串即可,性能更高还能避免二次序列化的转义问题:

public ActionResult SQLJSONPract()
{
    try
    {
        cmd.CommandText = "usp_JsonPract";
        SqlDataAdapter adp = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        adp.Fill(ds);
        StringBuilder jsonSb = new StringBuilder();
        foreach (DataRow row in ds.Tables[0].Rows)
        {
            jsonSb.Append(row[0].ToString());
        }
        // 直接返回JSON内容,指定正确的响应头
        return Content(jsonSb.ToString(), "application/json");
    }
    catch (Exception ex)
    {
        // 异常也返回标准JSON格式
        return Content(Newtonsoft.Json.JsonConvert.SerializeObject(new { code = 500, msg = ex.Message }), "application/json");
    }
}
存储过程优化建议
  • 修正语法笔误:将BeginSelect修改为BEGIN SELECT
  • 如果字段中存在特殊字符(如双引号、换行符),可以在生成JSON时统一转义,避免后续解析异常

内容的提问来源于stack exchange,提问作者Abuzar Ansari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:15:01