SQL Server使用FOR JSON返回JSON配合Python调用结果异常求助
问题原因
你遇到的返回行数变少的核心是SQL Server的FOR JSON语法的默认返回规则:当生成的JSON字符串总长度超过2033个字符时,SQL Server会自动将JSON拆分为多行返回,每行最多存储2033个字符,你看到的4行实际上是完整JSON被拆分后的4个片段,不是8条数据被合并了。
而搭配without_array_wrapper参数仅返回单条数据的问题,是因为该参数会移除JSON结果外层的数组包裹符[],当存在多条数据时返回的是多个独立JSON对象拼接的非标准格式,解析时只会识别到第一个对象。
解决方案
方案1:SQL层面拼接完整JSON再返回
通过子查询包裹FOR JSON语句,强制SQL Server将所有JSON片段拼接为单个完整字符串,仅返回一行结果:
-- 需要完整JSON数组时使用该语句 SELECT ( SELECT * FROM mydb FOR JSON AUTO ) AS full_json
Python侧对应代码如下:
import json cursor.execute(query) # 取第一行第一列的完整JSON字符串 full_json_str = cursor.fetchone()[0] # 解析为包含8条数据的Python列表 result = json.loads(full_json_str)
方案2:Python侧直接转换查询结果(更可控)
如果不需要在SQL层面完成JSON转换,更推荐直接查询原生数据,在Python侧完成格式转换,可避开SQL Server的JSON拆分规则限制:
import json cursor.execute("SELECT * FROM mydb") # 获取查询字段名 columns = [col[0] for col in cursor.description] # 将每行数据转为字典,组装为列表 data_list = [dict(zip(columns, row)) for row in cursor.fetchall()] # 如需JSON字符串可调用json.dumps json_str = json.dumps(data_list, ensure_ascii=False)
内容的提问来源于stack exchange,提问作者tstudent
相关产品推荐
相关产品推荐

