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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:59:59