【问题标题】:Decode bracket-encoded dictionary in query string [closed]在查询字符串中解码括号编码的字典[关闭]
【发布时间】:2013-08-12 15:56:41
【问题描述】:

我有以下查询字符串'?attr[foo]=1&attr[bar]=2'

有没有一种简单的方法可以使用现有的库将其解码成字典:'{attr: {'foo':1,'bar':2}}'

我知道我可以很容易地为此实现一个解码器,只需询问是否有一个解码器可以做到这一点。

【问题讨论】:

  • 标准库中没有任何东西可以处理这个问题,因为没有标准来编码这种格式。
  • 是否有一种标准方法来对 URL 上的字典/哈希进行编码?这是 Backbone 执行此操作的默认方式,所以我想知道。
  • 有各种相互竞争的“标准”,但没有一个成为标准机构。
  • 使用会话传递字典效果很好,恕我直言

标签: python query-string


【解决方案1】:
import re
import urlparse

s = '?attr[foo]=1&attr[bar]=2'

def parse(s):
    d = {}
    for key, value in urlparse.parse_qs(s).items():
        match = re.match(r'(?P<key>[^\[]+)\[(?P<value>[^\]]+)\]', key)
        gd = match.groupdict()
        d.setdefault(gd['key'], {})[gd['value']] = value[0]
    return d

print(parse(s[1:]))

打印:

{'attr': {'foo': '1', 'bar': '2'}}

【讨论】:

  • 正则表达式比我的实现中的更受保护。谢谢
【解决方案2】:

这是另一种方法,可以在 cmets 中回答您的问题。

是否有一种标准方法可以对 URL 上的字典/哈希进行编码?

您可以使用 JSON,使用 json.dumps()urllib.parse.quote() 进行编码:

>>> from urllib.parse import quote, unquote
>>> quote(json.dumps({'attr': {'foo': 1, 'bar': 2}}))
'%7B%22attr%22%3A%20%7B%22foo%22%3A%201%2C%20%22bar%22%3A%202%7D%7D'

还有urllib.parse.unquote()json.loads() 用于解码:

>>> json.loads(unquote('%7B%22attr%22%3A%20%7B%22foo%22%3A%201%2C%20%22bar%22%3A%202%7D%7D'))
{'attr': {'foo': 1, 'bar': 2}}

请注意,在 Python 2.x 上,urllib.parse 模块不存在,请改用 urllib2.quote()urllib2.unquote()

由于转义,URL 变得有点难看,但编码和解码是微不足道的,所以这是一个好方法,只要您不需要人们能够轻松键入或理解编码的 URL。

【讨论】:

  • 我会使用它,但我需要与 Backbone 兼容,并且不想覆盖一堆 fetchs。
  • 解决不了问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 2023-03-12
相关资源
最近更新 更多