2.28. JSON¶
JSON(JavaScript Object Notation)是一种用于结构化数据的紧凑、可读的文本格式。它定义了六种类型 —— 字符串、数字、布尔值、null、数组和对象 —— 每一种都直接对应到一个 Python 值,因此在 Python 与 JSON 之间转换,无论哪个方向都只需一次函数调用。
JSON 是配置文件和 Web API 的通用语言。每当你需要把一小批设置以一种也能用肉眼阅读的形式保存到磁盘,或者需要与另一个程序交换结构化数据时,就可以使用它。
两个函数就能覆盖大多数需求:
json.dumps()—— dump string:把一个 Python 值变成一个 JSON 字符串。json.loads()—— load string:把一个 JSON 字符串解析回 Python。
json.dump / json.load 这一对(没有 s)做的是同样的工作,但直接接受一个文件对象。
2.28.1. 编码(dumps)¶
import json
config = {
"name": "OpenMV",
"width": 320,
"tags": ["red", "round"],
}
text = json.dumps(config)
print(text)
输出:
{"name": "OpenMV", "width": 320, "tags": ["red", "round"]}
对应关系是:
该集合之外的任何东西(自定义类、bytes 缓冲区、set)都会抛出 TypeError。请先转换该值。
备注
CPython 的 json.dumps() 接受一个 indent 参数以输出美化格式;MicroPython 的则不接受。唯一的格式控制旋钮是 separators,它控制行内的间距 —— 传入 (',', ':') 可得到最紧凑的形式。如果需要多行、带缩进的输出,则必须手动生成。
2.28.2. 解码(loads)¶
text = '{"name": "OpenMV", "width": 320}'
config = json.loads(text)
print(config["name"], config["width"])
输出:
OpenMV 320
JSON 对象会变成 dict,数组会变成 list,其余类型则映射回它们的 Python 等价物。无效的 JSON 会抛出 ValueError。
2.28.3. 读写文件¶
基于文件的这一对函数与 with 配合得很好:
import json
with open("config.json") as f:
config = json.load(f)
config["width"] = 640
with open("config.json", "w") as f:
json.dump(config, f)
把 JSON 文件当作一个完整的记录来对待 —— 读入它,修改 Python 值,再写回去。试图在文件里就地编辑 JSON,通常带来的 bug 比省下的还要多。