C#使用FOR JSON AUTO查询大数据时JSON拆分解析失败如何解决
问题根因
SQL Server 执行带FOR JSON AUTO/FOR JSON PATH语法的查询时,若生成的单条JSON结果长度超过2033字符,会自动按固定长度将结果拆分为多行片段返回,拆分位置仅按字符长度截断,不会考虑JSON语法结构完整性。直接读取未拼接的拆分片段做JSON解析,必然会因为结构断裂抛出格式错误。
解决方法
可任选以下一种方案修复:
方案1:C#端拼接所有返回片段(改动最小)
指定SqlQuery的返回类型为字符串集合,拿到所有拆分的片段后直接拼接为完整JSON字符串,再做解析即可:
// 读取所有拆分的JSON片段 var jsonSegments = _invoices.GetContext().Database() .SqlQuery<string>($"SELECT * FROM {tableName} FOR JSON AUTO") .ToList(); // 拼接为完整合法的JSON字符串 string validJson = string.Concat(jsonSegments); // 执行解析 var json = JArray.Parse(validJson);
方案2:SQL端返回完整单值结果(无拆分)
通过T-SQL变量接收JSON查询结果,让SQL Server直接返回完整的单条字符串,从根源避免结果拆分:
string validJson = _invoices.GetContext().Database() .SqlQuery<string>($@" DECLARE @result NVARCHAR(MAX) SET @result = (SELECT * FROM {tableName} FOR JSON AUTO) SELECT @result ") .First(); var json = JArray.Parse(validJson);
安全提示:代码中直接拼接
tableName的写法存在SQL注入风险,生产环境使用前必须对传入的表名做合法性校验,禁止直接透传未经过滤的用户输入。
内容的提问来源于stack exchange,提问作者nightwolf555
相关产品推荐
相关产品推荐

