这是一级嵌套转换的解决方案。
import json
input_list = [{'item1':"value",'item2':[{'tinyitem21':'tinyvalue21','tinyitem22':'tinyvalue22'}]},{'item3':[{'tinyitem31':'tinyvalue31','tinyitem32':'tinyvalue32'}],'item4':'value4'}]
for index, j in enumerate(range(len(input_list))):
for key, value in input_list[index].items():
if isinstance(value, list) and len(value) == 1: # Checking for single dictionary as multiple values of dict cannot considered as json
input_list[index][key] = value[0]
print(json.dumps(input_list, indent=3))
输出:
[
{
"item1": "value",
"item2": {
"tinyitem21": "tinyvalue21",
"tinyitem22": "tinyvalue22"
}
},
{
"item3": {
"tinyitem31": "tinyvalue31",
"tinyitem32": "tinyvalue32"
},
"item4": "value4"
}
]
假设索引 0 处 item2 的值有多个字典,那么它应该被视为字符串值,如下面的输出所示
import json
input_list = [{'item1':"value",'item2':[{'tinyitem21':'tinyvalue21','tinyitem22':'tinyvalue22'},{'tinyitem23':'tinyvalue21','tinyitem24':'tinyvalue22'}]},{'item3':[{'tinyitem31':'tinyvalue31','tinyitem32':'tinyvalue32'}],'item4':'value4'}]
for index, j in enumerate(range(len(input_list))):
for key, value in input_list[index].items():
if isinstance(value, list): # without checking len of list
input_list[index][key] = ','.join(map(str, value)) # string value be assigned instead of dictionary
print(json.dumps(input_list, indent=3))
输出将是字符串而不是 dict,但如果您注意到 item3 是列表的单个 dict 但仍被分配为 str。
[
{
"item1": "value",
"item2": "{'tinyitem21': 'tinyvalue21', 'tinyitem22': 'tinyvalue22'},{'tinyitem23': 'tinyvalue21', 'tinyitem24': 'tinyvalue22'}"
},
{
"item3": "{'tinyitem31': 'tinyvalue31', 'tinyitem32': 'tinyvalue32'}",
"item4": "value4"
}
]
用一个/多个 dict 处理两个列表,具有更高的可读性。
for index, j in enumerate(range(len(input_list))):
for key, value in input_list[index].items():
if isinstance(value, list) and len(value) == 1: # Checking for single dictionary as multiple values of dict cannot considered as json
input_list[index][key] = value[0]
if isinstance(value, list) and len(value) > 1: # for list of dict with more than one
input_list[index][key] = ','.join(map(str, value)) # string value be assigned instead of dictionary
如果您想使用 CDJB 提到的综合方式,您需要再添加一个条件,因为如果列表大小超过 1,它将默默地忽略第二个索引。
[{k: v[0] if isinstance(v, list) and len(v) == 1 else v for k, v in d.items()} for d in input_list]
输出:
[
{
"item1": "value",
"item2": "{'tinyitem21': 'tinyvalue21', 'tinyitem22': 'tinyvalue22'},{'tinyitem23': 'tinyvalue21', 'tinyitem24': 'tinyvalue22'}"
},
{
"item3": {
"tinyitem31": "tinyvalue31",
"tinyitem32": "tinyvalue32"
},
"item4": "value4"
}
]