我将JSON数据提交给我的api(使用Flask构建)端点,我需要将数据导出到excel但问题是,一旦我的api收到数据并加载 request.json 数据的“正文”部分被扰乱 - 不是我收到的相同顺序,这完全打破了我的表格标题,更不用说所需的输出格式。
包括我收到的api原始JSON数据下面
{
"data": {
"header": [
"date,group.groupname,user.NameSurname,forwarding_number,reciver_number,CallerNameSurname,alert,connection,call_summ"
],
"body": [
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Romāns Tiščenko",
"forwarding_number": "66055002",
"reciver_number": "66055002",
"CallerNameSurname": false,
"alert": "00:00:14",
"connection": "00:00:53",
"call_summ": "00:01:07"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Romāns Tiščenko",
"forwarding_number": "66055002",
"reciver_number": "66055002",
"CallerNameSurname": false,
"alert": "00:00:27",
"connection": "00:00:25",
"call_summ": "00:00:52"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Romāns Tiščenko",
"forwarding_number": "66055002",
"reciver_number": "66055002",
"CallerNameSurname": false,
"alert": "00:00:16",
"connection": "00:01:00",
"call_summ": "00:01:16"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Arvīds Boļesko",
"forwarding_number": "66055001",
"reciver_number": "66055001",
"CallerNameSurname": false,
"alert": "00:00:22",
"connection": "00:00:52",
"call_summ": "00:01:14"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Romāns Tiščenko",
"forwarding_number": "66055002",
"reciver_number": "66055002",
"CallerNameSurname": false,
"alert": "00:00:18",
"connection": "00:00:09",
"call_summ": "00:00:27"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Romāns Tiščenko",
"forwarding_number": "66055002",
"reciver_number": "66055002",
"CallerNameSurname": false,
"alert": "00:00:09",
"connection": "00:01:59",
"call_summ": "00:02:08"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Romāns Tiščenko",
"forwarding_number": "66055002",
"reciver_number": "66055002",
"CallerNameSurname": false,
"alert": "00:00:08",
"connection": "00:02:14",
"call_summ": "00:02:22"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Roberts Neijs",
"forwarding_number": "66055003",
"reciver_number": "66055003",
"CallerNameSurname": false,
"alert": "00:00:04",
"connection": "00:00:01",
"call_summ": "00:00:05"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Arvīds Boļesko",
"forwarding_number": "66055001",
"reciver_number": "66055001",
"CallerNameSurname": false,
"alert": "00:00:57",
"connection": "00:01:26",
"call_summ": "00:02:23"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Roberts Neijs",
"forwarding_number": "66055003",
"reciver_number": "66055003",
"CallerNameSurname": false,
"alert": "00:00:05",
"connection": "00:02:23",
"call_summ": "00:02:28"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Roberts Neijs",
"forwarding_number": "66055003",
"reciver_number": "66055003",
"CallerNameSurname": false,
"alert": "00:00:06",
"connection": "00:00:44",
"call_summ": "00:00:50"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Romāns Tiščenko",
"forwarding_number": "66055002",
"reciver_number": "66055002",
"CallerNameSurname": false,
"alert": "00:00:08",
"connection": "00:02:43",
"call_summ": "00:02:51"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Roberts Neijs",
"forwarding_number": "66055003",
"reciver_number": "66055003",
"CallerNameSurname": false,
"alert": "00:00:05",
"connection": "00:01:13",
"call_summ": "00:01:18"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Roberts Neijs",
"forwarding_number": "66055003",
"reciver_number": "66055003",
"CallerNameSurname": false,
"alert": "00:00:09",
"connection": "00:00:01",
"call_summ": "00:00:10"
},
{
"date": "2013-01-08",
"group.groupname": "administration",
"user.NameSurname": "Ieva Sproģe",
"forwarding_number": "67783165",
"reciver_number": "67783165",
"CallerNameSurname": false,
"alert": "00:00:06",
"connection": "00:01:30",
"call_summ": "00:01:36"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Roberts Neijs",
"forwarding_number": "66055003",
"reciver_number": "66055003",
"CallerNameSurname": false,
"alert": "00:00:06",
"connection": "00:00:50",
"call_summ": "00:00:56"
},
{
"date": "2013-01-08",
"group.groupname": "administration",
"user.NameSurname": "Ieva Sproģe",
"forwarding_number": "67783165",
"reciver_number": "67783165",
"CallerNameSurname": false,
"alert": "00:00:04",
"connection": "00:02:00",
"call_summ": "00:02:04"
},
{
"date": "2013-01-08",
"group.groupname": "customerService",
"user.NameSurname": "Roberts Neijs",
"forwarding_number": "66055003",
"reciver_number": "66055003",
"CallerNameSurname": false,
"alert": "00:00:07",
"connection": "00:00:26",
"call_summ": "00:00:33"
},
{
"date": "2013-01-08",
"group.groupname": "administration",
"user.NameSurname": "Ieva Sproģe",
"forwarding_number": "67783165",
"reciver_number": "67783165",
"CallerNameSurname": false,
"alert": "00:00:04",
"connection": "00:00:13",
"call_summ": "00:00:17"
}
],
"footer": [
",,,,,,7,8,9"
],
"filename": "outGoingAnswered.xls"
}
}
正如我所说,一旦用 request.json 读入api,“body”的每个“行”内的数据都会被扰乱 - 订单被破坏。它应该如标题所示。
我尝试使用不同的json库加载它但结果是相同的,加载的数据与给定的顺序不同。我完全不知道为什么它会以这种方式发生,这让我的生活变得非常困难,因为我对Python相对较新。
我应该提到我无法将标题列的键匹配,因为标题的键可能比“body”“row”中的键少。
作为示例输出,我可以提供稍微不同的已发布JSON数据的“加扰版本”:
{
"data": {
"body": [
{
"group.groupname": "customerService",
"connection": "00:01:28",
"call_summ": "00:01:42",
"CallerNameSurname": "false",
"forwarding_number": "66055002",
"user.NameSurname": "Arnolds Apels",
"date": "2012-12-13",
"reciver_number": "66055002",
"alert": "00:00:14"
},
{
"group.groupname": "customerService",
"connection": "00:01:33",
"call_summ": "00:01:45",
"CallerNameSurname": "false",
"forwarding_number": "66055002",
"user.NameSurname": "Arnolds Apels",
"date": "2012-12-13",
"reciver_number": "66055002",
"alert": "00:00:12"
},
{
"group.groupname": "administration",
"connection": "00:00:30",
"call_summ": "00:00:33",
"CallerNameSurname": "false",
"forwarding_number": "67783165",
"user.NameSurname": "Ieva Sproģe",
"date": "2012-12-13",
"reciver_number": "67783165",
"alert": "00:00:03"
}
],
"header": [
"date,group.groupname,user.NameSurname,forwarding_number,reciver_number,CallerNameSurname,alert,connection,call_summ"
],
"footer": [
"false,false,user.NameSurname,forwarding_number,reciver_number,CallerNameSurname,alert,connection,call_summ"
],
"filename": [
"asdasda.xls"
]
}
}
为了更好地衡量添加excel导出代码:
r = request.json
data = r['data']
if data:
# Initialize excel export
excel = Workbook()
sheet = excel.add_sheet('Report')
## Excel headers
# Setup font styling
font = Font()
font.name = 'Arial'
font.bold = True
# Setup cell border styling
borders = Borders()
borders.bottom = 1
borders.right = 1
# Setup formating style
style = XFStyle()
style.font = font
style.borders = borders
# Write headers
header = data['header'][0]
headers = header.split(',')
h = 0
for col in headers:
if col == 'false':
col = ''
sheet.write(0, h, col, style)
h += 1
# Write body
rows = data['body']
i = 1
for row in rows:
x = sheet.row(i)
y = 0
for key, value in row.iteritems():
x.write(y, value)
y += 1
i += 1
# Write footer
footer = data['footer'][0]
footers = footer.split(',')
f = 0
for col in footers:
if col == 'false':
col = ''
sheet.write(i, f, col)
f += 1
# Setup column widths
if h > f:
cols = h
else:
cols = f
a = 0
while a < cols:
sheet.col(a).width = 5000
a += 1
# Get report filename
filename = data['filename'][0]
# Setup report path
path = "/path/to/exports/" + filename
# Save the report
excel.save(path)
答案 0 :(得分:2)
Python字典无序,JSON对象也是如此。你看到的行为是正常的。
如果您需要保留订购,请不要使用dict()
,而是使用列表元组:
[
["date", "2013-01-08"],
["group.groupname", "customerService"],
["user.NameSurname", "Romāns Tiščenko"],
["forwarding_number", "66055002"],
["reciver_number", "66055002"],
["CallerNameSurname", false],
["alert", "00:00:14"],
["connection", "00:00:53"],
["call_summ", "00:01:07"]
],
# ... etc.
或您还可以使用data['header'][0]
字符串按顺序读取正文dict()
值,因为已经为您订购:
rows = data['body']
i = 1
for row in rows:
x = sheet.row(i)
y = 0
for col in headers:
x.write(y, row.get(col, ''))
y += 1
i += 1