87 lines
2.9 KiB
Python
87 lines
2.9 KiB
Python
#!/usr/bin/env python
|
||
# coding=utf-8
|
||
|
||
"""
|
||
@author: CNWei
|
||
@Software: PyCharm
|
||
@contact: t6i888@163.com
|
||
@file: yaml_processor
|
||
@date: 2025/3/4 17:28
|
||
@desc:
|
||
"""
|
||
import logging
|
||
from typing import Union, Any
|
||
from pathlib import Path
|
||
import json
|
||
from commons.file_processors.base_processor import BaseFileProcessor
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
class JsonProcessor(BaseFileProcessor):
|
||
"""
|
||
用于处理 JSON 文件的类。
|
||
提供了从文件加载 JSON 数据为字典,以及将字典保存为 JSON 文件的功能。
|
||
"""
|
||
|
||
def __init__(self, filepath: Union[str, Path], **kwargs):
|
||
"""
|
||
初始化 JsonFile 对象。
|
||
|
||
Args:
|
||
filepath: YAML 文件的路径 (可以是字符串或 pathlib.Path 对象).
|
||
"""
|
||
super().__init__(filepath, **kwargs)
|
||
# self.filepath: Path = Path(filepath) # 确保 filepath 是 Path 对象
|
||
|
||
def load(self) -> dict[str, Any]:
|
||
"""
|
||
从 Json 文件加载数据。
|
||
:return:
|
||
"""
|
||
if not self.filepath.exists():
|
||
logger.warning(f"文件 {self.filepath} 不存在.")
|
||
raise FileNotFoundError(f"文件 {self.filepath} 不存在.")
|
||
try:
|
||
with open(self.filepath, "r", encoding="utf-8") as f:
|
||
loaded_data = json.load(f)
|
||
if not isinstance(loaded_data, dict): # 确保加载的是字典
|
||
logger.error(f"YAML文件 {self.filepath} 的根节点不是一个字典/映射.")
|
||
raise ValueError(f"YAML文件 {self.filepath} 的根节点不是一个字典/映射.")
|
||
return loaded_data
|
||
except json.JSONDecodeError as e:
|
||
logger.error(f"加载 YAML 文件 {self.filepath} 时出错: {e}")
|
||
raise e
|
||
|
||
def save(self, data: dict, new_filepath: Union[str, Path, None] = None) -> None:
|
||
"""
|
||
将字典数据保存到 json 文件。
|
||
|
||
Args:
|
||
:param data:
|
||
:param new_filepath: 可选参数,指定新的文件路径。如果为 None,则覆盖原文件。
|
||
"""
|
||
filepath = Path(new_filepath) if new_filepath else self.filepath
|
||
filepath.parent.mkdir(parents=True, exist_ok=True)
|
||
try:
|
||
with open(filepath, "w", encoding="utf-8") as f:
|
||
json.dump(
|
||
data,
|
||
f,
|
||
ensure_ascii=False, # 允许非ASCII字符
|
||
sort_keys=False # 不排序键
|
||
)
|
||
logger.info(f"数据已成功保存到 {filepath}")
|
||
except (TypeError, OSError, json.JSONDecodeError) as e:
|
||
logger.error(f"保存 JSON 文件 {filepath} 时出错: {e}")
|
||
raise e
|
||
|
||
|
||
if __name__ == '__main__':
|
||
# 示例用法
|
||
json_path = r'E:\PyP\InterfaceAutoTest\TestCases\test_1_user.json' # 你的 JSON 文件路径
|
||
json_file = JsonProcessor(json_path)
|
||
print(json_file.load())
|
||
print(type(json_file))
|
||
# json_file.save()
|