动态字典转换为JSON的问题
我现在在做一个项目,使用的是JavaScript和Python,搭配Jquery Datatables插件和Django框架。我的问题是,我想在Python中创建一个字典,然后用json.dumps(dictionary)把它转换成JSON格式,以便发送给JQuery。
转换是成功的,我在调试器中可以看到JQuery/Javascript代码里的数据,但它没有填充到我的表格中,原因是JSON格式不正确。我认为这可能是因为我在Python代码中创建字典的方式不对。我知道我在这一步做错了。所有我看到的例子都是硬编码的字典,而我需要动态创建我的字典。这是我在Python中使用的代码。如果有人知道我哪里出错了,请告诉我,这让我很头疼。这是我字典代码的最新版本:
dictionary = {}
array = []
status = 'OFF'
for item in self.scanResults:
if item[6]:
status = 'ON'
else:
status = 'OFF'
array.append( {'MAC_ADDRESS':item['mac_addr'],
'IP_ADDRESS':item['ip_addr'],
'NAME':item['name'],
'OS':item['os'],
'OS_VERSION':item['os_version'],
'WORKGROUP':'--',
'STATUS':status
})
dictionary = dict({'aaData': array})
在JQuery那边,JSON应该是这个格式:
{"aaData": [[..,..,..,..,],[..,..,..,..]]}
谢谢你们提供的任何帮助
克里斯
编辑:
补充信息。抱歉之前没有提到。 我这样编码的:
return HttpResponse(simplejson.dumps(response_dict), mimetype='application/javascript')
结果的屏幕截图是:
{"aaData": [{"STATUS": "ON", "WORKGROUP": "--", "IP_ADDRESS": "192.168.0.2", "OS_VERSION": "8.04", "MAC_ADDRESS": "00:10:e3:42:16:35", "OS": "Linux", "NAME": "Machine_One"}, {"STATUS": "ON", "WORKGROUP": "--", "IP_ADDRESS": "192.168.0.3", "OS_VERSION": "8.04", "MAC_ADDRESS": "00:19:a3:41:16:31", "OS": "Linux", "NAME": "Machine_Two"}, {"STATUS": "ON", "WORKGROUP": "--", "IP_ADDRESS": "192.168.0.4", "OS_VERSION": "8.04", "MAC_ADDRESS": "00:19:b3:43:16:32", "OS": "Linux", "NAME": "Machine_Three"}, {"STATUS": "ON", "WORKGROUP": "--", "IP_ADDRESS": "192.168.0.5", "OS_VERSION": "8.04", "MAC_ADDRESS": "00:19:c3:44:16:33", "OS": "Linux", "NAME": "Machine_Four"}, {"STATUS": "ON", "WORKGROUP": "--", "IP_ADDRESS": "192.168.0.6", "OS_VERSION": "8.04", "MAC_ADDRESS": "00:19:d3:45:16:34", "OS": "Linux", "NAME": "Machine_Five"}, {"STATUS": "ON", "WORKGROUP": "--", "IP_ADDRESS": "192.168.0.7", "OS_VERSION": "8.04", "MAC_ADDRESS": "00:19:e3:46:16:37", "OS": "Linux", "NAME": "Machine_Six"}, {"STATUS": "ON", "WORKGROUP": "--", "IP_ADDRESS": "192.168.0.8", "OS_VERSION": "8.04", "MAC_ADDRESS": "00:19:f3:47:16:38", "OS": "Linux", "NAME": "Machine_Seven"}, {"STATUS": "ON", "WORKGROUP": "--", "IP_ADDRESS": "192.168.0.9", "OS_VERSION": "8.04", "MAC_ADDRESS": "00:19:g3:48:16:38", "OS": "Linux", "NAME": "Machine_Eight"}, {"STATUS": "ON", "WORKGROUP": "--", "IP_ADDRESS": "192.168.0.10", "OS_VERSION": "8.04", "MAC_ADDRESS": "00:19:h3:49:16:41", "OS": "Linux", "NAME": "Machine_Nine"}]}
我实际期望的结果是:
{"aaData":[["ON","--","192.168.0.6", "8.04", "00:19:d3:45:16:34", "Linux", "Machine_Five"], ["ON","--","192.168.0.6", "8.04", "00:19:d3:45:16:34", "Linux", "Machine_Five"]]} 这只是给你一个概念。
我在用jQuery DataTables插件。我相信问题出在字典格式不正确,也就是我的错。我是Python新手,尝试了很多种字典的写法,发现了10多种错误的方式,我只需要一点提示,找到正确的方法。
再次感谢
克里斯
解决了:
我通过从服务器返回一个数组的数组(也就是列表的列表)解决了这个问题,并在客户端解析它们。由于列表的大小是固定的,这不会造成性能问题。我会在以后更仔细地研究这个问题,并发布一个更好的解决方案或更优雅的解决办法。
4 个回答
看起来“预期的数据”应该是五个项目放在一个列表里(而且顺序有点乱);但你却把七个项目放进了一个字典里——这是为什么呢??
再说一次(考虑到你没有提前说明的修改):
“预期的数据”似乎应该是七个项目放在一个列表里(顺序还是有点乱);而你却把七个键值对放进了一个字典里——这是为什么呢??
你确定预期的数据列表应该是那种乱七八糟的顺序吗?
如果它格式不正确,那就是你把它弄错了。你是想说:
array.append([item['mac_addr'],
item['ip_addr'],
item['name'],
item['os'],
item['os_version'],
'--',
status
])
你提到的代码里缺少一个关键部分,就是我们需要知道你是怎么把字典转换成字符串的。如果你只是用 str(dictionary)
这样做,那是行不通的。你需要用 simplejson
来编码。你可以通过 easy_install 安装这个库,如果你用的是 Python 2.6 及以上版本,它已经包含在 json
里了。
要把一个 Python 对象编码成 JSON 字符串,只需要用 json.dumps(dictionary)
这个方法。
你说你的 JavaScript 代码期待一个包含嵌套列表的对象,但你的 Python 代码生成的对象看起来像 {"aaData": [{..:.., ..:..},{..:.., ..:..}]}
,也就是一个字典,里面有一个列表,列表里又是字典。如果问题不在于你如何编码 JSON 字符串,那能不能更清楚地说明你期待的对象是什么样的?
编辑
正如 Ignacio Vazquez-Abrams 所说,在你的 Python 代码中,你把字典添加到列表里,然后期待它们在编码成 JSON 时神奇地变成列表。你要么需要修改你的 JavaScript 代码来适应你现在发送的数据,要么把你当前的 Python 代码替换成 Ignacio 建议的类似代码。
我建议你选择第一个选项,因为用列表来表示结构时容易出错,这样你可能会因为索引搞错而使用了错误的值。如果你保持使用字典/对象,那么你可以通过名称来访问内容,避免这个问题。