#!/usr/bin/env python # -*- coding: utf-8 -*- """ 通用JSON/字典解析工具 """ import json from typing import Any, Dict, Optional from utils.logger import get_logger logger = get_logger("json_parser") def safe_parse_json(param: str, script_id: Optional[str] = None, default_return: Any = None) -> Any: """安全解析JSON或Python字典格式的字符串 尝试多种解析方式: 1. 首先尝试标准JSON解析 2. 如果JSON解析失败,尝试使用eval解析Python字典格式 Args: param: 要解析的字符串 script_id: 脚本ID,用于日志记录 default_return: 解析失败时的默认返回值 Returns: 解析后的数据,失败时返回default_return """ if not isinstance(param, str): if script_id: logger.error(f"脚本 {script_id} 输入参数不是字符串类型: {type(param)}") else: logger.error(f"输入参数不是字符串类型: {type(param)}") return default_return # 1. 首先尝试标准JSON解析 try: data = json.loads(param) return data except json.JSONDecodeError: # 2. 如果JSON解析失败,尝试使用eval解析Python字典或列表格式 try: # 安全地使用eval解析字典或列表字符串 stripped_param = param.strip() if (stripped_param.startswith('{') and stripped_param.endswith('}')) or \ (stripped_param.startswith('[') and stripped_param.endswith(']')): data = eval(param, {"__builtins__": {}}, {}) return data else: if script_id: logger.error(f"脚本 {script_id} 参数格式不正确: {param}") else: logger.error(f"参数格式不正确: {param}") return default_return except Exception as eval_error: if script_id: logger.error(f"脚本 {script_id} 参数解析失败: {str(eval_error)}, 参数: {param}") else: logger.error(f"参数解析失败: {str(eval_error)}, 参数: {param}") return default_return def safe_parse_dict(param: str, script_id: Optional[str] = None) -> Optional[Dict[str, Any]]: """安全解析为字典类型 Args: param: 要解析的字符串 script_id: 脚本ID,用于日志记录 Returns: 解析后的字典,失败时返回None """ data = safe_parse_json(param, script_id, None) if not isinstance(data, dict): if script_id: logger.error(f"脚本 {script_id} 参数格式错误,期望字典类型: {type(data)}") else: logger.error(f"参数格式错误,期望字典类型: {type(data)}") return None return data def safe_parse_list(param: str, script_id: Optional[str] = None) -> Optional[list]: """安全解析为列表类型 Args: param: 要解析的字符串 script_id: 脚本ID,用于日志记录 Returns: 解析后的列表,失败时返回None """ data = safe_parse_json(param, script_id, None) if not isinstance(data, list): if script_id: logger.error(f"脚本 {script_id} 参数格式错误,期望列表类型: {type(data)}") else: logger.error(f"参数格式错误,期望列表类型: {type(data)}") return None return data