【问题标题】:jquery: post with json will actually post arrayjquery:使用 json 发布实际上会发布数组
【发布时间】:2010-11-12 07:04:35
【问题描述】:

我有一个 python 作为 CGI,来自 jquery 的 POST 会将 json 对象转换为数组,所以当我看到来自 jquery 的 POST 时,我实际上看到了:

login_user[username]=dfdsfdsf&login_user[password]=dsfsdf

([ 和 ] 已经转义)

我的问题是如何在 python 中将此字符串转换回 JSON?或者,我怎样才能将此字符串转换为 python 数组/字典结构,以便我可以更轻松地处理它?

[编辑] 我的 jquery 正在发布:

{'login_user': {'username':username, 'password':password}}

【问题讨论】:

  • 你的 jQuery 代码看起来像...?
  • 正则表达式听起来如何?我们可以尝试为此设计一个模式……尽管我不能停止重新引用:“有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题。 ~ Jamie Zawinski,在 comp.emacs.xemacs 中
  • @Soul:如果你已经知道它们是个坏主意,那你为什么要建议使用正则表达式? Python为此提供了一个simplejson 库...一旦您设法将其放入字典中。
  • @Soul: & 在我看来是一个完全合法的密码字符......这就是问题所在。正则表达式可能适用于大多数情况,但像这样的一件小事,它们就会爆炸。
  • @Soul:更不用说你的正则表达式解决了一个非常具体的用例......如果他改变他的变量名怎么办?如果他想添加更多怎么办?如果数组是多维的怎么办? (见他的另一个问题)......任何小的变化,你必须重新编写你的正则表达式......除非它是一个一次性的工作,否则它是不切实际的。

标签: python json


【解决方案1】:

如果你想要完成的是从浏览器发送结构化数据,然后在你的 Python 后端解压并保持相同的结构,我建议如下:

  1. 在浏览器中创建 JavaScript 对象来保存您的数据:

    var d = {} 
    d['login_user'] = { 'username': 'foo', 'password': 'bar' }
    
  2. 序列化为 JSON,使用https://github.com/douglascrockford/JSON-js
  3. POST 到你的后端做这样的事情:

    $.post(url, {'data': encoded_json_data}, ...)

  4. 在您的 Python 代码中,解析 JSON,在我的示例中,POST 是您在 CGI 脚本中获取 POST 数据的地方:

    data = json.loads(POST['data'])
    data['login_user']
    

【讨论】:

    【解决方案2】:
    import re
    
    thestring = "login_user[username]=dfdsfdsf&login_user[password]=dafef"
    
    pattern = re.compile(r'^login_user\[username\]=(.*)&login_user\[password\]=(.*)')
    match = pattern.search(thestring)
    print match.groups()
    

    输出: >>> ('dfdsfdsf', 'dafef')

    因此,

    lp = match.groups()
    print "{'login_user': {'username':"+lp[0]+", 'password':"+lp[1]+"}}"
    

    应承担:>>> {'login_user': {'username':dfdsfdsf, 'password':dafef}}

    【讨论】:

    • 不是我。但我会 +1 让你回到 0
    【解决方案3】:
    >>> import json
    >>> data = {'login_user':{'username':'dfdsfdsf', 'password':'dsfsdf'}}
    >>> json.dumps(data)
    '{"login_user": {"username": "dfdsfdsf", "password": "dsfsdf"}}'
    

    我怀疑 data 已经包含在 GET 变量中,如果它来自 URL...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      相关资源
      最近更新 更多