使用嵌套字典编码 URL
Encode URL with nested dictionaries
我使用的 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 中实现这种编码的最佳方法是什么?
使用递归:
将您的字典传递给 dict_to_urlencoded(),它将根据您的描述 return 编码格式字符串。 (未排序)
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
我使用的 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 中实现这种编码的最佳方法是什么?
使用递归:
将您的字典传递给 dict_to_urlencoded(),它将根据您的描述 return 编码格式字符串。 (未排序)
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