Python 配置读取入门:让 JSON 语法检查与字段校验各司其职

举报
yd_235314356 发表于 2026/10/23 01:57:30 2026/10/23
【摘要】 用 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 辅助撰写的原创入门示例,不涉及真实业务数据。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。