Python 配置读取入门:让 JSON 语法检查与字段校验各司其职
很多小脚本会把参数放进 JSON 文件,但“文件能解析”并不等于“配置可以使用”。例如,端口写成字符串、服务名只有空格,都不会必然触发 JSON 语法错误。下面用一个小例子,把读取、语法解析和业务校验分开。
一、先明确输入约定
假设配置文件名为 config.json,内容如下:
{"service": "demo", "port": 8080}
这里约定 service 是非空字符串,port 是 1 到 65535 之间的整数。约定应由实际应用决定;这个端口范围只是示例,不代表端口一定可用,也不代表当前进程有权限绑定它。
二、用标准库读取并校验
import json
from pathlib import Path
def load_config(path):
text = Path(path).read_text(encoding="utf-8")
config = json.loads(text)
if not isinstance(config, dict):
raise ValueError("配置顶层必须是对象")
service = config.get("service")
if not isinstance(service, str) or not service.strip():
raise ValueError("service 必须是非空字符串")
port = config.get("port")
if type(port) is not int or not 1 <= port <= 65535:
raise ValueError("port 必须是 1 到 65535 的整数")
return {"service": service.strip(), "port": port}
if __name__ == "__main__":
config = load_config("config.json")
print(config["service"], config["port"])
把代码保存为 check_config.py,与配置文件放在同一个目录中,并在该目录运行 python check_config.py。有效示例应输出 demo 8080。代码只读取配置,不启动服务,也不修改文件。
三、为什么分层处理错误
文件不存在,属于路径或部署问题;文件读到了但编码不正确,属于输入编码问题;JSON 解析失败,属于语法问题;解析后字段类型不对,属于应用约定问题。把这些情况混成“读取失败”,会让排查变得困难。
示例有意让异常向上传递。交互式工具可以在入口分别捕获 OSError、UnicodeError、JSONDecodeError 和 ValueError,再给出简短提示;库函数则可以把异常交给调用者处理。不要用宽泛的 except 后返回空字典,否则缺少配置可能直到后续流程才暴露。
四、用反例验证边界
将 port 改成字符串 “8080”、布尔值 true、数字 0,或者把 service 改为只有空格的字符串,都应被拒绝;将顶层改为数组也应被拒绝。这里用 type(port) is int,是为了明确排除布尔值:在 Python 中,bool 是 int 的子类。
对于来源不可信的配置,还需要限制输入规模;这个短例子并不是通用的安全解析框架。若将来要校验嵌套对象或大量字段,可以再考虑引入专门的模式校验工具。小项目先写清输入约定和错误边界,通常比一开始堆叠依赖更容易维护。
参考:Python 官方 json 与 pathlib 模块文档(Python 官方文档站,Library Reference)。本文为 AI 辅助撰写的原创入门示例,不涉及真实业务数据。
- 点赞
- 收藏
- 关注作者
评论(0)