Django, Python: 有没有简单方法将PHP风格的括号POST键转换为多维字典?

2 投票
4 回答
1166 浏览
提问于 2025-04-15 16:56

具体来说,我有一个表单,它会调用一个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

撰写回答