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
相关产品推荐
相关产品推荐

