2017-09-07 1 views
2

ich meine eigene API-Schnittstelle für meine Python-Anwendung erschaffe (warum auch immer :))Convert Formkörper in Wörterbuch in Python

Ich bin der Lage, meine Anfrage Körper in einer Form-Datenfolge zB zu erhalten

"name=prakashraman&tvshows%5B%5D=lost&tvshows%5B%5D=buffy" 

ich möchte das

umgewandelt werden
{ 
    "name": "prakashraman", 
    "tvshows": ["lost", "buffy"] 
} 

Alle Ideen, wie ich über diese gehen könnte?

Antwort

2

Hier ist eine naive Art und Weise, dies zu tun:

s = "name=prakashraman&tvshows%5B%5D=lost&tvshows%5B%5D=buffy" 

d = {} 
for x in s.split('&'): 
    k, sep, v = x.partition('=') 
    if sep != '=': 
     raise ValueError('malformed query') 
    k = k.split('%')[0] 
    if k in d: 
     if isinstance(d[k], list): d[k].append(v) 
     else: d[k] = [d[k], v] 
    else: 
     d[k] = v 

print(d) 
# {'name': 'prakashraman', 'tvshows': ['lost', 'buffy']} 

Wenn Sie jedoch Ihre Ausgabe als QueryDict standardisiert halten müssen, der einfache Weg ist urllib.parse.parse_qs zu verwenden (in Python 2: urlparse.parse_qs) auf der Saite :

>>> from urllib import parse 
>>> s = "name=prakashraman&tvshows%5B%5D=lost&tvshows%5B%5D=buffy" 
>>> parse.parse_qs(s) 
{'name': ['prakashraman'], 'tvshows[]': ['lost', 'buffy']} 
+0

Wunderbarer Dank! Ich denke, ich könnte es verwenden :) Obwohl, würde es für tiefere nächste [] Arrays funktionieren? –

+0

@PrakashRaman Ja, sollte es. Der Zweig 'isinstance (d [k], list)' behandelt fortlaufend * hängt * an einen vorhandenen Schlüssel an. –

+0

Wunderbar, danke! Ich denke, das ist meine beste Option für jetzt! –