优先指定 encoding='utf-8',因windows下python默认用gbk解码而json文件多为utf-8编码;若仍失败可试gb18030或用chardet检测真实编码。

json.load 读取文件时遇到 UnicodeDecodeError 怎么办
默认用 json.load 打开含中文或特殊字符的配置文件,常报 UnicodeDecodeError: 'gbk' codec can't decode byte 0xa1 in position 123。这不是 JSON 格式问题,而是 Python 在 Windows 下默认用 gbk 解码文件,而配置文件实际是 UTF-8 编码。
- 必须显式指定
encoding='utf-8',哪怕文件看着“没乱码” - 别依赖
open(...).read().encode().decode()绕弯子,徒增出错概率 - 示例正确写法:
with open('config.json', encoding='utf-8') as f: data = json.load(f)
嵌套太深的字典怎么安全取值不崩
JSON 转成的 dict 可能有 5 层嵌套,直接写 data['server']['db']['host']['ip'] 一碰缺失键就抛 KeyError。生产环境不能靠 try/except 处处包着。
- 用
.get()链式调用最稳妥:data.get('server', {}).get('db', {}).get('host', {}).get('ip') - 若需默认值,第二个参数传进去,比如
.get('port', 5432) - 别用
data['server']['db'].get('host')—— 前面某层空了照样崩
JSON 里混了注释或尾逗号,json.load 直接报错
标准 JSON 不允许注释(// 或 /* */)和末尾逗号({"a": 1,}),但人写配置时经常加,json.load 会直接抛 json.decoder.JSONDecodeError。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 这不是 bug,是合规性强制要求;Python 标准库不处理非标 JSON
- 临时方案:用
json5库替代(pip install json5),它兼容注释、单引号、尾逗号:import json5 with open('config.json', encoding='utf-8') as f: data = json5.load(f) - 长期建议:CI 阶段用
jq -n --argfile c config.json '$c'或 pre-commit 钩子校验格式,别把脏数据带进运行时
大配置文件加载慢,有没有更快的替代方案
几百 KB 以上的 JSON(比如 OpenAPI spec 或前端路由配置),用标准 json.load 解析可能卡几十毫秒,对 CLI 工具或高频加载场景明显可感。
-
ujson和orjson是两个主流加速选项,都比内置快 2–5 倍 -
orjson更激进:只支持 UTF-8 输入、返回 bytes、不支持自定义 decoder —— 但纯解析场景最快,且内存更省 - 示例:
import orjson with open('config.json', 'rb') as f: # 注意是 'rb' data = orjson.loads(f.read()) # 返回 dict,不是 str - 注意:
orjson.loads()输入必须是bytes,不能传文件对象,也不能用encoding参数
配置里藏着多层嵌套、非标语法、编码陷阱和性能瓶颈——这些不是边缘情况,而是日常高频踩坑点。真正难的从来不是“怎么转成字典”,而是“怎么让字典稳稳地、快快地、带着原意落到你手里”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










