用 Python 标准库读取 JSON 配置:类型与错误处理
【摘要】 使用 Python 标准库解析 JSON 配置,验证端口和布尔值,并处理格式错误。
JSON 常用于保存简单配置。Python 的 json 模块可以直接把 JSON 对象转换为字典,但解析成功并不意味着配置内容一定符合应用要求:字段可能缺失,类型也可能不正确。
先观察解析结果
import json
config = json.loads('{"port": 8080, "debug": false}')
print(config["port"], type(config["port"]).__name__, config["debug"])
print(json.dumps(config, ensure_ascii=False, sort_keys=True))
本地运行输出:
8080 int False
{"debug": false, "port": 8080}
JSON 的 false 在 Python 中成为 False;序列化时又写回小写 false。sort_keys 让字典键按顺序输出,便于比较;它不改变原有字典。ensure_ascii=False 可以让非 ASCII 字符直接输出,写入文件时仍要指定合适编码。
验证配置的基本约束
import json
def read_config(text):
try:
value = json.loads(text)
except json.JSONDecodeError as exc:
raise ValueError(f"JSON 格式错误,行 {exc.lineno} 列 {exc.colno}") from exc
if not isinstance(value, dict):
raise ValueError("配置顶层必须是对象")
port = value.get("port")
if type(port) is not int or not 1 <= port <= 65535:
raise ValueError("port 必须是 1 到 65535 的整数")
debug = value.get("debug", False)
if type(debug) is not bool:
raise ValueError("debug 必须是布尔值")
return {"port": port, "debug": debug}
这里对 port 用 type 而非 isinstance,是因为 Python 中 bool 是 int 的子类,isinstance(True, int) 会返回 True。端口检查只验证数字范围,不保证端口可用,也不代表应用可以绑定该端口。debug 缺省为 False,缺少 port 则明确报错。
读取文件时可以用 open(path, encoding=“utf-8”) 和 json.load;文件不存在及权限错误属于文件操作异常,应按调用场景单独处理。配置中若含密钥,应使用适当的密钥管理方式,避免把敏感值写入公开仓库或日志。
参考:Python 标准库 json 文档。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)