如何递归识别并转换JSON中符合指定格式的日期时间字符串
嵌套JSON指定格式时间字符串转datetime实现方案
完全可以实现,核心是通过深度优先递归遍历所有JSON节点,无需提前预知结构即可支持任意层级嵌套,具体逻辑如下:
- 遍历逻辑:遇到JSON对象(字典)则遍历所有键值对,遇到JSON数组(列表)则遍历所有元素,遇到嵌套结构就递归进入下一层处理
- 匹配逻辑:对所有字符串类型的值,直接用
datetime.strptime按%Y-%m-%dT%H:%M:%S格式尝试解析,解析成功则替换为datetime对象,解析失败则保留原字符串,避免误转普通文本 - 兼容逻辑:数字、布尔值、空值等非字符串类型直接原样返回,不做额外处理
参考实现代码(Python)
from datetime import datetime from typing import Any import json def recursive_convert_datetime(target: Any) -> Any: # 处理字典结构 if isinstance(target, dict): return {key: recursive_convert_datetime(value) for key, value in target.items()} # 处理列表结构 elif isinstance(target, list): return [recursive_convert_datetime(item) for item in target] # 处理字符串,尝试解析时间 elif isinstance(target, str): try: return datetime.strptime(target, "%Y-%m-%dT%H:%M:%S") except ValueError: return target # 其余基础类型直接返回 else: return target # 测试用例 if __name__ == "__main__": raw_json = """ { "data":[ { "name":"Testing", "dob":"2001-01-01T01:00:30" }, { "name":"Testing2", "dob":"2001-01-01T01:00:30", "licence_info":{ "issue_date":"2020-01-01T01:00:30" } } ] } """ parsed_data = json.loads(raw_json) converted_result = recursive_convert_datetime(parsed_data) # 验证转换效果 print(type(converted_result["data"][0]["dob"])) # 输出: <class 'datetime.datetime'> print(type(converted_result["data"][1]["licence_info"]["issue_date"])) # 输出: <class 'datetime.datetime'> print(type(converted_result["data"][0]["name"])) # 输出: <class 'str'> 普通字符串不受影响
提示:如果后续需要兼容带毫秒、时区的时间格式,仅需要调整
strptime的格式匹配规则,递归遍历的核心逻辑不需要修改。
内容的提问来源于stack exchange,提问作者rainman_s
相关产品推荐
相关产品推荐

