如何将pyodbc调用MSSQL 2017函数返回的JSON转为Python字典/JSON对象?
当然可以!轻松把返回结果转成Python字典
完全没问题,你只需要两步就能把pyodbc返回的Row对象转换成可直接访问的Python字典/JSON对象,咱们来具体说:
步骤1:从pyodbc.Row中提取JSON字符串
cursor.fetchone()返回的pyodbc.Row是一个类似元组的结构,你的MSSQL函数返回的JSON结果就存在这个结构的第一个位置(索引0)。所以直接用索引取值就能拿到原始的JSON字符串:
json_str = row[0]
如果担心查询可能没有返回结果,建议先加个非空判断:
if row: json_str = row[0] else: print("未获取到发票JSON数据")
步骤2:用json模块解析成Python字典
Python内置的json模块可以直接把合法的JSON字符串转换成字典对象,非常方便:
import json # 解析JSON字符串 invoice_dict = json.loads(json_str)
现在你就可以像操作普通字典一样访问数据了,比如invoice_dict['InvoiceNumber']或者invoice_dict['Items'][0]['Price'],甚至可以直接把这个字典传给requests.post的json参数,不用再手动转字符串。
额外注意事项(避坑)
- JSON格式合法性:确保你的MSSQL函数
dbo.fnInvoiceJSON返回的是标准的JSON格式,如果格式有问题(比如引号不匹配、逗号错误),json.loads()会抛出JSONDecodeError,建议加个异常捕获:try: invoice_dict = json.loads(json_str) except json.JSONDecodeError as err: print(f"JSON解析失败:{err}") # 可以在这里排查MSSQL函数的JSON生成逻辑 - UTF-8 BOM问题:有时候MSSQL返回的JSON字符串会带有UTF-8 BOM(字节顺序标记),这会导致
json.loads()解析失败。遇到这种情况可以先去掉BOM:import codecs if json_str.startswith(codecs.BOM_UTF8): json_str = json_str[len(codecs.BOM_UTF8):]
完整示例代码
import pyodbc import json import codecs # 假设已建立数据库连接conn cursor = conn.cursor() cursor.execute("SELECT dbo.fnInvoiceJSON(%s,%s);" % (posted, vat)) row = cursor.fetchone() if row: json_str = row[0] # 处理可能的UTF-8 BOM if json_str.startswith(codecs.BOM_UTF8): json_str = json_str[len(codecs.BOM_UTF8):] try: invoice_data = json.loads(json_str) # 示例:访问字典中的数据 print(f"发票编号:{invoice_data['InvoiceNo']}") # 直接传给requests.post # requests.post(target_api_url, json=invoice_data) except json.JSONDecodeError as e: print(f"解析JSON出错:{str(e)}") else: print("没有获取到有效数据")
内容的提问来源于stack exchange,提问作者Petsku
相关产品推荐
相关产品推荐

