今天项目需要对列表字典混合嵌套的对象进行key重命名,经过一番搜索后找到如下代码
od = {'name': 'John', '1': [{'name': 'innername'}]}
kd = { 'name': 'cname', '1': '2', 3: 'z' }
def replace_keys(data_dict, key_dict):
new_dict = { }
if isinstance(data_dict, list):
dict_value_list = list()
for inner_dict in data_dict:
dict_value_list.append(replace_keys(inner_dict, key_dict))
return dict_value_list
else:
for key in data_dict.keys():
value = data_dict[key]
new_key = key_dict.get(key, key)
if isinstance(value, dict) or isinstance(value, list):
new_dict[new_key] = replace_keys(value, key_dict)
else:
new_dict[new_key] = value
return new_dict
return new_dict
nd = replace_keys(od, kd)
print(nd)
微调了一下,使其适应的范围更广
def replace_keys(data_dict, key_dict):
if isinstance(data_dict, list):
dict_value_list = list()
for inner_dict in data_dict:
dict_value_list.append(replace_keys(inner_dict, key_dict))
return dict_value_list
elif isinstance(data_dict, dict):
new_dict = {}
for key in data_dict.keys():
value = data_dict[key]
new_key = key_dict.get(key, key)
if isinstance(value, dict) or isinstance(value, list):
new_dict[new_key] = replace_keys(value, key_dict)
else:
new_dict[new_key] = value
return new_dict
else:
return data_dict
上面的代码还能怎么用?
如果我们希望将下面对象中的所有key转为大写
['0', {'a': 1, 'b': {'c': 2}, 'c': [{'d': 3}, {'e': 4}]}, [{'f': 5}, '6']]
['0', {'A': 1, 'B': {'C': 2}, 'C': [{'D': 3}, {'E': 4}]}, [{'F': 5}, '6']]
就可以这么写:
data = ['0', {'a': 1, 'b': {'c': 2}, 'c': [{'d': 3}, {'e': 4}]}, [{'f': 5}, '6']]
def replace_keys(data_dict):
if isinstance(data_dict, list):
dict_value_list = list()
for inner_dict in data_dict:
dict_value_list.append(replace_keys(inner_dict))
return dict_value_list
elif isinstance(data_dict, dict):
new_dict = {}
for key in data_dict.keys():
value = data_dict[key]
new_key = key.upper()
if isinstance(value, dict) or isinstance(value, list):
new_dict[new_key] = replace_keys(value)
else:
new_dict[new_key] = value
return new_dict
else:
return data_dict
print(replace_keys(data))
如果前端小姐姐要求你返回给她的json必需符合驼峰命名法,我们就可以通过上面代码结合转换函数,对任意结构的json进行转换啦