Вот решение для вложенного преобразования первого уровня.
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"
}
]
И, скажем, если значение в item2
в индексе 0 имеет больше чем один dict , тогда это должно рассматриваться как строковое значение, как показано ниже: output
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
является единственным диктатом списка, но все же
[
{
"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) 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"
}
]