如何将嵌套字典中所有datetime转为字符串并保留原字典?
嵌套字典中Datetime类型转字符串的代码修复
问题根源
原代码的核心问题是处理列表元素时未将递归转换后的结果替换回列表,导致列表内的嵌套字典/列表仍保留原datetime对象;同时缺少对列表中直接存在的datetime元素的处理逻辑。
修复方案
- 新增通用元素处理函数,统一处理单个元素(datetime、字典、列表、普通值)的转换逻辑
- 确保递归处理时所有嵌套结构都返回新对象,完全不修改原字典
- 同时处理字典的键和值中的datetime类型
修复后的完整代码
import datetime DATE_FMT = '%Y-%m-%d %H:%M' def process_element(element): # 处理datetime/date类型 if isinstance(element, (datetime.datetime, datetime.date)): return datetime.datetime.strftime(element, DATE_FMT) # 递归处理嵌套字典 elif isinstance(element, dict): return decode_dict(element) # 递归处理嵌套列表 elif isinstance(element, list): return [process_element(item) for item in element] # 普通值直接返回 else: return element def decode_dict(d): result = {} for key, value in d.items(): # 处理字典键中的datetime processed_key = process_element(key) if isinstance(key, (datetime.datetime, datetime.date)) else key # 处理字典值中的所有元素 processed_value = process_element(value) result[processed_key] = processed_value return result # 测试用字典 item3 = {"vs": [{'Id': { 'mval': datetime.datetime(2000, 10, 1, 0, 0), 'vc': {datetime.datetime(2000, 10, 1, 0, 0): 1, datetime.datetime(2000, 10, 2, 0, 0): 1, datetime.datetime(2000, 10, 11, 0, 0): 1}}}]} # 转换并打印结果 converted_item = decode_dict(item3) print(converted_item)
执行结果
{'vs': [{'Id': {'mval': '2000-10-01 00:00', 'vc': {'2000-10-01 00:00': 1, '2000-10-02 00:00': 1, '2000-10-11 00:00': 1}}}]}
关键说明
process_element函数实现了对所有元素类型的统一处理,避免重复逻辑decode_dict仅专注于字典的遍历与键值处理,递归调用process_element处理嵌套结构- 所有转换操作都返回新对象,原字典
item3完全不会被修改
内容的提问来源于stack exchange,提问作者DearBeliever
相关产品推荐
相关产品推荐

