# coding=utf-8 import hashlib import os from pathlib import Path import re from .logger_utils import create_logger import json from typing import Any, Union from datetime import datetime def parse_nested_json( json_str: str, default: Any = None, recursive: bool = True ) -> Union[dict, list, Any]: """ 解析多层嵌套的JSON字符串 :param json_str: 要解析的JSON字符串 :param default: 解析失败时返回的默认值 :param recursive: 是否递归解析嵌套的JSON字符串 :return: 解析后的Python对象 """ def _parse(obj: Any) -> Any: # 递归解析嵌套结构 if isinstance(obj, dict): return {k: _parse(v) for k, v in obj.items()} elif isinstance(obj, list): return [_parse(elem) for elem in obj] elif recursive and isinstance(obj, str): try: parsed = json.loads(obj) return _parse(parsed) # 递归解析新对象 except json.JSONDecodeError: return obj else: return obj # 处理空输入 if not json_str: return default if default is not None else {} try: # 首次解析外层JSON parsed = json.loads(json_str) # 递归处理嵌套结构 return _parse(parsed) except (TypeError, json.JSONDecodeError) as e: # 处理解码错误和类型错误 return default if default is not None else {} except Exception as e: # 其他异常处理(可选记录日志) return default if default is not None else {} def convert_timestamp(timestamp): """ 自动识别时间戳是秒级还是毫秒级,并转换为 datetime 对象。 参数: timestamp -- 时间戳(整数或浮点数) 返回: datetime 对象 """ # 如果时间戳大于 1e10,认为是毫秒级时间戳 if timestamp > 1e10: timestamp /= 1000.0 # 转换为秒级时间戳 return datetime.fromtimestamp(timestamp) def make_sha256_hash(file_path: str) -> str: """ 计算文件的哈希值 :param file_path: 文件路径 :return: 哈希值的十六进制字符串 """ hash_obj = hashlib.new("sha256") with open(file_path, "rb") as f: while chunk := f.read(8192): # 分块读取避免大文件内存溢出 hash_obj.update(chunk) return hash_obj.hexdigest() def css_to_dict(css_line): """ 将单行CSS变量声明转换为Python字典 参数: css_line (str): 包含CSS变量声明的字符串,例如: '--ds-button-color: #fff; -button-text-color: #4c4c4c; button-border-color: rgba(0, 0, 0, 0.12);' 返回: dict: 包含CSS变量名和值的字典 """ # 使用正则表达式匹配所有变量声明 # 匹配格式:可能带有1-2个横线的变量名,然后是冒号和值 pattern = r'(-{0,2}[a-zA-Z0-9-]+)\s*:\s*([^;]+);?' matches = re.findall(pattern, css_line) # 将匹配结果转换为字典 result = {} for match in matches: var_name = match[0] # 保留原始横线数量 var_value = match[1].strip() result[var_name] = var_value return result