使用嵌套字典对URL进行编码

时间:2018-09-27 11:25:42

标签: python python-3.x urlencode

我使用的API在请求的正文中不接受JSON。它使用x-www-form-urlencoded

因此,如果我必须发送此dict

{
    'a': 1,
    'b': 2,
    'c': {
        'k': 3,
        'v': 4,
        'l': {
            'p': 5,
            'q': 6,
        },
    },
}

必须这样编码:

a=1
b=2
c[k]=3
c[v]=4
c[l][p]=5
c[l][q]=6

但是,urllib.parse.urlencode不会这样解析dict。取而代之的是,它将原样编码c内容并将其放入(c={encodeddict})中。

我尝试自己实现一些编码器,但无法处理多个嵌套的dicts。我只能编码1级dicts(例如c[k]=3),但不能递归编码到最后一级(例如,c[l][p]=5)。

在Python 3中实现这种编码的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我通过递归实现了自己。

将您的字典传递到dict_to_urlencoded(),它将根据您的描述返回编码格式的字符串。 (未排序)

def dict_to_urlencoded(d):
    return kv_translation(d, "", "")


def kv_translation(d, line, final_str):
    for key in d:
        key_str = key if not line else "[{}]".format(key)
        if type(d[key]) is not dict:
            final_str = "{}{}{}={}\n".format(final_str, line, key_str, d[key])
        else:
            final_str = kv_translation(d[key], line + key_str, final_str)
    return final_str