【问题标题】:dynamic dictionary to JSON problem动态字典到 JSON 问题
【发布时间】:2011-03-29 10:18:51
【问题描述】:

我目前正在使用带有 Jquery Datatables 插件和 Django 的 javascript 和 python 开发一个项目。我的问题是我正在尝试在 Python 中创建一个字典,然后我希望执行 json.dumps(dictionary) 以便将其发送到 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": [[..,..,..,..,],[..,..,..,..]]}

欢迎您提供任何帮助

克里斯

编辑:

附加信息。很抱歉之前没有包含它。 我按以下方式对其进行编码:-

返回 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”} ,{“状态”:“开”,“工作组”:“--”,“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”},{“状态” :“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 多种不这样做的方法,我只需要提示这种难以捉摸的正确方法。

再次欢呼

克里斯

已解决:

如果您愿意,我已经通过从服务器传回数组数组(列表列表)解决了这个问题,并在客户端解析它们,因为列表的大小是固定的,这不会导致性能问题。我将在以后更仔细地研究这个问题,并发布一个更好的修复或更优雅的解决方案。

【问题讨论】:

  • 你在做json.dumps(dictionary)吗?结果是什么?它与您的预期有何不同? (我根本不理解预期的输出——请给出一些实际的示例数据。)
  • 您的值需要用引号引起来
  • @meouw:它们会在序列化时出现。
  • 您混合了下标类型:item[6] 和 item['mac_addr'] 等——这是故意的吗?对吗?
  • 是的 item[6] 是正确的,它只是一个令人讨厌的小参考,稍后将进行修改。不影响其他任何东西

标签: javascript jquery python django json


【解决方案1】:

如果它是畸形的,那么你就是在畸形它。你的意思是:

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

【讨论】:

  • 我真的希望他不是那个意思! “预期数据”例如["192.168.0.6", "8.04", "00:19:d3:45:16:34", "Linux", "Machine_Five"] 看起来像 IP、os_version、MAC、os、名称(顺序不同)并且没有“--”和状态
【解决方案2】:

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

要将 Python 对象编码为 JSON 字符串,只需使用 json.dumps(dictionary)

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

编辑

正如 Ignacio Vazquez-Abrams 在您的 Python 代码中所说,您将字典添加到列表中,然后期望它们在编码为 JSON 时神奇地转换为列表。你要么需要转换你的 Javascript 来处理你现在发送的数据,要么用类似于 Ignacio 建议的代码替换你当前的 Python 代码。

我建议使用这些选项中的第一个,因为在使用列表表示结构时很容易出错,并且您最终会使用错误的值,因为您弄错了索引。如果您将其保留为字典/对象,那么您可以按名称访问事物,您就可以避免这个问题。

【讨论】:

  • 干杯我会试一试我希望有一个优雅的解决方案,但也许 javascript 端的一个小解析器不会太糟糕。至少我可以在以后回到这个问题。欢呼
  • 干杯我选择了这种方法,它可以解决,但现在还可以。等我有空的时候再看看这个问题
【解决方案3】:

“预期数据”似乎是 LIST 中的 五个 项(以相当出乎意料的顺序,即打乱的顺序);您正在将 7 个 项填充到 DICT 中 -- WHY??

采取 2(考虑您未通知的编辑):

LIST 中的“预期数据”似乎是 7 个(以相当出乎意料的顺序,即打乱的顺序);您将七个 key:value 项填充到 DICT -- WHY??

你确定预期的数据列表应该是那个打乱的顺序吗?

【讨论】:

  • 预期数据只是为了说明预期结果的格式。
  • @Chris Lamb:列表中的五个项目绝对不知道它应该是一个字典中的七个项目——这太荒谬了!
  • 很抱歉你觉得它“荒谬”,如果你能检查一下,我实际上修改了它。
  • 好的,我再次道歉,未通知的编辑是由于之前没有在此处编辑,并且有点渴望旧的提交按钮。预期数据仅用于格式而不是内容。我意识到我应该提到这一点,或者应该花时间准确地描述预期的数据。我将来会这样做。谢谢你的cmets
【解决方案4】:

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"]]
把它放在字典里,dictionary = {'aaData': array}

【讨论】:

  • 您的代码片段不是有效的 Python ...[expression1:expression2] 仅在表达式计算为序列下标时才有意义
  • 我已经尝试过了,只是再次尝试了两次 语法无效,因为该格式项目,项目,。 . .需要一个列表,即:{}。无论如何都很好。
  • @Chris Lamb:列出即{} ???请尝试理解这一点:[] 是一个列表; {} 是一个字典。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 2019-10-13
相关资源
最近更新 更多