2011-03-29 26 views
0

我目前正在使用javascript和python与Jquery Datatables插件和Django的项目。我的问题是,我正在尝试在Python中创建一个字典,然后我希望执行一个json.dumps(字典)以将其发送到JQuery。动态字典到JSON问题

转换被执行,我可以使用调试器查看JQuery/Javascript代码中的数据,但是它并未填充我的表格,原因是JSON格式错误。我相信这是由于Python代码中的Dictionary创建的方式。我知道我在这一步做错了事。我见过的所有例子都显示了一个硬编码字典,我需要动态创建字典。这是我在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": [[..,..,..,..,],[..,..,..,..]]} 

干杯任何帮助,您可以提供

克里斯

编辑:

更多信息。对不起,以前没有包括它。 我编码它的方式如下: -

返回的HttpResponse(simplejson.dumps(response_dict),MIME类型= '应用/ 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 “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 “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” “:” - “,”IP_ADDRESS“:”192.168.0.8“,”OS_VERSION“:”8.04“,”MAC_ADDRESS“:”00:19:f3:47:16:38“,”OS“ ,“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”}]}

实际epected结果将是: -

{ “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种以上的方法,我不需要这样做,我只需要提示那种难以捉摸的正确方式。

干杯再次

克里斯

解决:

我已经从服务器传回一个数组的数组(名单列表)如果你喜欢和解析他们在解决问题客户端由于列表的固定大小,这不会导致性能问题。我会在晚些时候更密切地关注这个问题,并提出一个更好的解决方案或更优雅的解决方案。

+1

你在做'json.dumps(字典)'吗?那是什么结果?它与你期望的有什么不同? (我完全不理解预期输出 - 请给出一些实际示例数据。) – 2011-03-29 10:24:06

+0

您的值需要用引号 – meouw 2011-03-29 10:27:33

+0

@meouw:它们将在序列化时生效。 – 2011-03-29 10:29:29

回答

0

您问题中的代码不包含我们需要查看的关键位 - 您如何将字典序列化为字符串。如果你只是在做str(dictionary)那么这将不起作用,你需要使用simplejson对它进行编码。你可以用easy_install来安装这个库,或者如果你使用的是Python 2.6+,那么它包含在json中。

要将Python对象作为JSON字符串进行简单编码,请使用json.dumps(dictionary)

你说你的Javascript代码需要一个包含嵌套列表的对象,但是你的Python代码似乎在字典内部产生了一个像{"aaData": [{..:.., ..:..},{..:.., ..:..}]}这样的对象,即一个字典。如果问题不在于如何编码,那么JSON字符串可以更清楚地表明您期望的对象?

编辑

如Python代码伊格纳西奥巴斯克斯 - 艾布拉姆斯状态要添加字典到列表中,然后希望他们都奇迹般地变成名单时,他们被编码为JSON。您或者需要将您的Javascript转换为适用于您目前发送的数据,或者将您当前的Python代码替换为Ignacio建议的类似内容。

我会建议这些选项中的第一个,因为使用列表来表示结构时很容易出错,并且最终会因为索引错误而使用错误的值。如果你把它保存为一个字典/对象,那么你可以通过名字访问事物,并避免了这个问题。

+0

干杯我会给它一个去我希望有一个优雅的解决方案,但也许在JavaScript结束一点解析器不会太糟糕。至少我可以在以后再回到这个问题上。欢呼 – Lipwig 2011-03-29 10:58:30

+0

干杯我选择了这种方法它的工作,但现在好了。当我有更多时间时,我将不得不再次看到问题 – Lipwig 2011-03-29 12:32:05

2

如果它格式不正确,那么你正在对它进行恶意修改。您的意思是:

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

我真的希望他不是那个意思! “预期数据”例如'[“192.168.0.6”,“8.04”,“00:19:d3:45:16:34”,“Linux”,“Machine_Five”]看起来像IP,os_version,MAC,os,名称(顺序不同)并没有' - '和状态 – 2011-03-29 10:53:53

0

“预期数据”似乎是在LISTFIVE项目(在一个相当意外的即炒顺序);你填塞SEVEN items into a DICT - 原因?

取2(把你的突击编辑考虑在内),

“预期数据”似乎是在LIST七(在一个相当意外即炒顺序);你正在填充七个关键:价值物品到DICT - 为什么?

你确定预期的数据列表应该是按照乱码顺序吗?

+0

预期的数据只是给出预期结果格式的概念。 – Lipwig 2011-03-29 11:08:22

+0

@Chris Lamb:列表中的五个项目绝对没有想法,它应该是一个字典中的七个项目 - 这是可笑的! – 2011-03-29 11:48:34

+0

对不起,你觉得它'可笑',如果你会检查我实际上修改它。 – Lipwig 2011-03-29 12:26:34

0

array.append([item['mac_addr'], # note: we are appending array. 
       item['ip_addr'], 
       item['name'], 
       item['os'], 
       item['os_version'], 
       '--', 
       status 
      ]) 

当你序列化这个,你会得到以下格式的数据。
[[ “XXX”, “YYY”, “ZZZ”],[ “XX1”, “YY1”, “ZZ1”]]
端起在字典,字典= { 'aaData':阵列}

+0

您的代码片段无效Python ...'[expression1:expression2]'仅在表达式求值为序列下标时才有意义 – 2011-03-29 11:53:51

+0

我已经尝试过,并且只是再次尝试过两次无效的语法,因为该格式项目,项目。 。 。需要列表,即:{}。无论如何,不​​妨试试。 – Lipwig 2011-03-29 11:59:15

+0

@Chris Lamb:**列表即{} ** ???请尝试理解这一点:'[]'是一个列表; '{}'是一个字典。 – 2011-03-29 12:03:04