Python 3.x 在Python中将SQL数据转换为JSON

Python 3.x 在Python中将SQL数据转换为JSON,python-3.x,Python 3.x,我已经使用Python调用带有参数的存储过程来获取数据。现在我希望我的数据应该是JSON格式的。我怎么能这样做 import pyodbc connection = pyodbc.connect("Driver={SQL Server};" "Server=server_name;" "Database=database_name;" "UID=user;"

我已经使用Python调用带有参数的存储过程来获取数据。现在我希望我的数据应该是JSON格式的。我怎么能这样做

import pyodbc

connection = pyodbc.connect("Driver={SQL Server};"
                      "Server=server_name;"
                      "Database=database_name;"
                      "UID=user;"
                      "PWD=@password;"
                      "Trusted_Connection=no;")

cursor = connection.cursor()

pno = 3 
psize = 2 

sql = "{call [NorthPointCore].[client].[test_python](?, ?)}"
values = (pno, psize)

cursor.execute(sql, (values))


columns = [column[0] for column in cursor.description]
results = []
for row in cursor.fetchall():
    results.append(dict(zip(columns, row)))

print(results)
运行上述代码后,我得到以下结果:

[{'AsOfDate': '2019-03-27', 'PortfolioName': 'VMFC', 'Strategy': 'CANADA', 'PMStrategy': 'CAD CONVERTS', 'PMTeam': 'CANADA (MANOS)', 'SubStrategy': 'TRE.CVCA', 'SecurityType': 'Equity', 'InvestmentType': None, 'SecurityName': 'EMEXF-USAA', 'InvestmentDescription': 'EMERALD PLANTATION HOLDINGS', 'Ticker': 'EMEXF', 'PositionDirection': 'Long', 'Qty': Decimal('1528493.0000000000000000'), 'MV_Base': Decima03-27', 'PortfolioName': 'VMFC', 'Strategy': 'CANADA', 'PMStrategy': 'CAD CONVERTS', 'PMTeam': 'CANADA (MANOS)', 'SubStrategy': 'BB.CVCA', 'SecurityType': 'Bond', 'InvestmentType': 'Convertible', 'SecurityName': 'BBCN/320SF-CNAA', 'InvestmentDescription': 'BLACKBERRY LTD', 'Ticker': 'BBCN', 'PositionDirection': 'Long', 'Qty': Decimal('19093.0000000000000000'), 'MV_Base': Decimal('0.0000'), 'LongMV': Decimal('0.0000'), 'StartPrice': Decimal('99.5000000000'), 'Price': Decimal('99.5000000000')}]
现在我想将上述数据转换为JSON,但它一直说错误: raise TypeError(类型为{o.类的对象名称} TypeError:Decimal类型的对象不可JSON序列化

如何消除错误,以所有JSON格式获取99.50而不是十进制('99.50),并获取简单的JSON数据?

您可以通过以下方式实现:

# first import json
import json
...
# returns a dict containing all rows
rows = cursor.fetchall() 

# Print rows in json format
print(json.dumps(rows))
编辑:
类型为Decimal的对象不可JSON序列化
可以使用序列化程序修复

导入十进制
def dec_序列化程序(o):
如果isinstance(o,十进制,十进制):
返回浮动(o)
dump(结果,默认值=dec_序列化程序)

如果您使用的是SQL Server 2016或更高版本,则必须使用FOR JSON子句以JSON文档的形式返回数据。请阅读更多信息。在SQL端执行此操作比在python端执行更有效

选择id,名字为“info.name”,姓氏为“info.姓氏”,年龄, 来自JSON路径的人的出生日期为dob


我已经根据您添加到问题中的编辑更新了我的答案,请看。