动态字典转换为JSON的问题

0 投票
4 回答
1822 浏览
提问于 2025-04-16 14:38

我现在在做一个项目,使用的是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 个回答

0

看起来“预期的数据”应该是五个项目放在一个列表里(而且顺序有点乱);但你却把七个项目放进了一个字典里——这是为什么呢??

再说一次(考虑到你没有提前说明的修改):

“预期的数据”似乎应该是七个项目放在一个列表里(顺序还是有点乱);而你却把七个键值对放进了一个字典里——这是为什么呢??

你确定预期的数据列表应该是那种乱七八糟的顺序吗?

2

如果它格式不正确,那就是你把它弄错了。你是想说:

    array.append([item['mac_addr'],
                item['ip_addr'],
                item['name'],
                item['os'],
                item['os_version'],
                '--',
                status
    ])
0

你提到的代码里缺少一个关键部分,就是我们需要知道你是怎么把字典转换成字符串的。如果你只是用 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 建议的类似代码。

我建议你选择第一个选项,因为用列表来表示结构时容易出错,这样你可能会因为索引搞错而使用了错误的值。如果你保持使用字典/对象,那么你可以通过名称来访问内容,避免这个问题。

撰写回答