apppublic/aidocs/jsonConfig.md
2025-10-05 11:23:33 +08:00

203 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 技术文档:`json_config.py`
```markdown
# JSON 配置管理模块技术文档
## 概述
本模块提供了一个基于 JSON 文件的配置管理系统,支持从文件或流中加载 JSON 数据,并通过字典对象方式访问。它结合了单例模式、路径解析和模板变量替换功能,适用于应用程序的配置读取与管理。
主要特性:
- 从 JSON 文件或文件对象加载数据
- 支持命名空间NS中的变量替换
- 使用 `DictObject` 实现属性式访问
- 全局唯一配置实例(单例模式)
- 跨平台路径处理
---
## 依赖库
### 内置模块
- `os`: 路径和环境操作
- `sys`: 命令行参数访问
- `json`: JSON 序列化/反序列化
- `pathlib.Path`: 现代化路径操作
### 自定义模块(来自 `appPublic` 包)
- `DictObject`: 字典封装为可点号访问的对象
- `SingletonDecorator`: 单例装饰器
- `ProgramPath`: 获取程序运行路径工具
- `ArgsConvert`: 支持 `$[var]$` 格式的字符串模板替换
> ⚠️ 注意:这些类需确保在项目中已正确定义并安装。
---
## 函数说明
### `key2ansi(dict)`
> **功能**:将字典的键由 Unicode 编码为 UTF-8 字节串(目前未生效)
#### 参数
| 参数名 | 类型 | 说明 |
|--------|----------|----------------|
| dict | `dict` | 输入字典 |
#### 返回值
- `dict`: 处理后的字典(当前版本实际未执行任何有效转换)
> ❗ 注:该函数存在逻辑问题 —— `return dict` 在函数开头即返回,后续代码不可达。建议移除或修复。
---
## 类说明
### `JsonObject(DictObject)`
> 继承自 `DictObject`,用于从 JSON 源加载数据并构建可属性访问的对象。
#### 构造函数:`__init__(jsonholder, keytype='ansi', NS=None)`
##### 参数
| 参数名 | 类型 | 必选 | 默认值 | 说明 |
|-------------|------------------|------|-----------|------|
| `jsonholder`| `str``file` | 是 | - | JSON 文件路径 或 已打开的文件对象 |
| `keytype` | `str` | 否 | `'ansi'` | 键类型(保留字段,当前无实际作用) |
| `NS` | `dict` | 否 | `None` | 命名空间,用于模板变量替换 |
##### 行为描述
1. 判断 `jsonholder` 类型:
- 若为字符串,则尝试以文本模式打开该路径对应的文件;
- 否则视为已打开的文件对象直接使用。
2. 使用 `json.load()` 解析内容。
3. 若发生异常,打印错误信息并重新抛出。
4. 若提供了 `NS`,使用 `ArgsConvert('$[', ']$')` 对结构进行变量替换(如 `$[home]$``/Users/name`)。
5. 将原始 `jsonholder``NS` 存入结果字典中作为元数据。
6. 调用父类 `DictObject.__init__()` 初始化动态属性。
##### 示例
```python
obj = JsonObject("config.json", NS={'home': '/Users/dev'})
print(obj.database_url) # 访问配置项
```
---
### `JsonConfig(JsonObject)`
> 单例类,继承自 `JsonObject`,保证全局仅存在一个配置实例。
#### 特性
- 使用 `@SingletonDecorator` 装饰,确保多次调用构造函数返回同一实例。
- 通常用于应用级配置共享。
##### 示例
```python
cfg1 = JsonConfig("a.json")
cfg2 = JsonConfig("a.json")
assert cfg1 is cfg2 # True同一实例
```
---
## 工具函数
### `getConfig(path=None, NS=None) -> JsonConfig`
> 快捷函数,用于获取默认配置文件 (`conf/config.json`) 的单例实例。
#### 参数
| 参数名 | 类型 | 必选 | 默认值 | 说明 |
|--------|----------|------|--------|------|
| `path` | `str` | 否 | 当前工作目录 | 配置文件所在根路径 |
| `NS` | `dict` | 否 | `None` | 扩展命名空间变量 |
#### 行为描述
1. 获取程序运行路径(`ProgramPath()`)。
2. 设置默认命名空间包含:
- `'home'`: 用户主目录
- `'workdir'`: 当前工作目录或传入路径
- `'ProgramPath'`: 程序启动路径
3.`NS` 提供额外变量,则合并到命名空间。
4. 加载 `<path>/conf/config.json` 文件。
5. 返回 `JsonConfig` 单例实例。
#### 返回值
- `JsonConfig`: 配置对象实例,支持属性式访问。
#### 示例
```python
config = getConfig()
print(config.server.port)
```
---
## 使用示例
### 主程序测试代码
```python
if __name__ == '__main__':
conf = JsonConfig(sys.argv[1])
conf1 = JsonConfig(sys.argv[1], keytype='ansi')
print("conf=", dir(conf))
print("conf1=", dir(conf1))
```
> 运行示例:
```bash
python json_config.py ./test_config.json
```
输出将显示两个配置对象的所有属性列表。
---
## 注意事项
1. **`key2ansi` 函数无效**
当前实现中 `return dict` 出现在函数第一行,导致其余代码无法执行。若意图是编码键名为 UTF-8请删除第一个 `return` 并启用注释代码。
2. **异常处理仅打印路径信息**
异常被捕获后打印 `self.__jsonholder__`,但此时 `self` 尚未完全初始化,可能导致属性不存在。建议改为打印 `jsonholder` 变量。
3. **文件关闭安全性**
- 文件在 `finally` 块中关闭,保障资源释放。
- 仅当输入为路径字符串时才关闭文件,避免对传入的文件对象误关闭。
4. **模板语法**
- 使用 `$[var]$` 作为占位符,例如:
```json
{
"data_dir": "$[home]/myapp/data"
}
```
- 在 `NS={'home': '/Users/john'}` 下会被替换为 `/Users/john/myapp/data`
---
## 安装要求
确保以下包可用(一般为内部开发包):
```text
appPublic.dictObject
appPublic.Singleton
appPublic.folderUtils
appPublic.argsConvert
```
可通过 pip 安装私有包或将其加入 PYTHONPATH。
---
## 版本历史
| 日期 | 修改人 | 描述 |
|------------|--------|------|
| 2025-04 | 开发者 | 初始版本发布 |
---
```
> ✅ 文档结束。此 Markdown 可直接集成至项目 Wiki 或生成 HTML/PDF 文档。