Django, Python: 有没有简单方法将PHP风格的括号POST键转换为多维字典?
具体来说,我有一个表单,它会调用一个Django服务(这个服务是用Piston写的,不过我觉得这并不重要),通过POST请求发送类似这样的内容:
edu_type[3][name] => a
edu_type[3][spec] => b
edu_type[3][start_year] => c
edu_type[3][end_year] => d
edu_type[4][0][name] => Cisco
edu_type[4][0][spec] => CCNA
edu_type[4][0][start_year] => 2002
edu_type[4][0][end_year] => 2003
edu_type[4][1][name] => fiju
edu_type[4][1][spec] => briju
edu_type[4][1][start_year] => 1234
edu_type[4][1][end_year] => 5678
我想在Python这边处理这些数据,得到类似这样的结果:
edu_type = {
'3' : { 'name' : 'a', 'spec' : 'b', 'start_year' : 'c', end_year : 'd' },
'4' : {
'0' : { 'name' : 'Cisco', 'spec' : 'CCNA', 'start_year' : '2002', 'end_year' : '2003' },
'1' : { 'name' : 'fiju', 'spec' : 'briju', 'start_year' : '1234', 'end_year' : '5678' },
},
}
有什么想法吗?谢谢!
4 个回答
0
我想接着Atli之前的回答,聊聊如何使用PHP的json_encode
...
在最基本的形式下,Python的字典(dict)和JSON的语法是一样的。你可以很简单地用eval()
来处理一个JSON结构,从而创建一个Python字典:
>>> blob = """{
... '3' : { 'name' : 'a', 'spec' : 'b', 'start_year' : 'c', 'end_year' : 'd' },
... '4' : {
... '0' : { 'name' : 'Cisco', 'spec' : 'CCNA', 'start_year' : '2002', 'end_year' : '2003' },
... '1' : { 'name' : 'fiju', 'spec' : 'briju', 'start_year' : '1234', 'end_year' : '5678' },
... },
... }"""
>>> edu_type = eval(blob)
>>> edu_type
{'3': {'end_year': 'd', 'start_year': 'c', 'name': 'a', 'spec': 'b'}, '4': {'1': {'end_year': '5678', 'start_year': '1234', 'name': 'fiju', 'spec': 'briju'}, '0': {'end_year': '2003', 'start_year': '2002', 'name': 'Cisco', 'spec': 'CCNA'}}}
那么,这样做是最好的方法吗?可能不是。但它确实有效,而且不需要用到正则表达式。虽然正则表达式在技术上可能更好,但考虑到调试和解决问题所花的时间,这绝对不是一个更快的选择。
JSON是一种很好的格式,适合用来传输数据。
Python也有一个json
模块,作为标准库的一部分。虽然这个模块对你要解析的输出要求更严格,但它确实是更好的选择(尽管需要更多的工作)。
1
Dottedish做的事情跟你想要的差不多。你可以在这个链接找到它:http://pypi.python.org/pypi/dottedish。它其实没有一个专门的主页,不过你可以从pypi上安装它,或者从github上下载源代码。
>>> import dottedish
>>> dottedish.unflatten([('3.name', 'a'), ('3.spec', 'b')])
{'3': {'name': 'a', 'spec': 'b'}}
4
我用Python写了一个小工具,可以处理多维字典。你可以在这个链接找到它:https://github.com/bernii/querystring-parser