在查询字符串中解码括号编码的字典

时间:2013-08-12 15:56:42

标签: python query-string

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

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

我知道我可以很容易地为此实现解码器,只是询问是否有解码器来执行此操作。

2 个答案:

答案 0 :(得分: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'}}

答案 1 :(得分:0)

这是一种替代方法,可以在评论中回答您的问题。

  

是否有标准方法对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,这是一个很好的方法。