2013-08-12 4 views
0

에 사전 브래킷 인코딩 된 I가 다음과 같은 쿼리 문자열 '?attr[foo]=1&attr[bar]=2'디코드 쿼리 문자열

사전에 그 디코딩 할 수있는 쉬운 방법이 있나요 : '{attr: {'foo':1,'bar':2}}' 기존 라이브러리를 사용하는가?

저는 이것을 위해 디코더를 구현할 수 있다는 것을 알고 있습니다. 단지 이것을 수행하는 디코더가 있는지 묻는 것뿐입니다.

+0

해당 형식을 코드화하는 표준이 없으므로 표준 라이브러리에는이 형식을 처리 할 수있는 방법이 없습니다. –

+0

URL에 사전/해시를 인코딩하는 표준 방법이 있습니까? 이것이 백본이 수행하는 기본 방법이므로 궁금합니다. – leonsas

+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'}} 
+0

Regex는 제 구현에서보다 안전합니다. 감사합니다 – leonsas

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}} 

파이썬에서 urllib.parse를 2.x으로하는 것으로 모듈이 없으면 대신 urllib2.quote()urllib2.unquote()을 사용하십시오.

이스케이프 때문에 URL이 약간 엉망이되지만 인코딩과 디코딩은 쉽지 않으므로 사람들이 인코딩 된 URL을 쉽게 입력하거나 이해할 필요가없는 한 좋은 접근 방법입니다.

+0

이걸 사용 하겠지만, 백본과 호환 될 수 있어야하고,'fetch's를 오버라이드하고 싶지는 않습니다. – leonsas