
001 JSON 是什么?
JSON 是一种轻量级的数据格式,常用于保存配置文件、接口数据、用户信息、设备参数等。它本质上是文本文件,人可以读,程序也可以读。在 Python 中,我们通常会把 JSON 文件读取出来,然后转换成 dict 字典来使用。
002 JSON 和 Python dict 的区别
JSON 和 Python 字典长得很像,但它们不是同一个东西。
JSON 是一种数据格式。我们常说的 JSON 文件,可以理解成一种“专门用来存数据的文本”。
比如软件配置、用户信息、参数内容,都可以写到一个 .json 文件里。程序下次启动时,还可以再把这些内容读出来。
而 dict 是 Python 程序里的“字典数据类型”。
JSON 文件里的内容,Python 不能直接当字典来用。要先把 JSON 文件读进来,转换成 dict 类型的变量,然后才能像操作普通字典一样,读取、修改里面的数据。
003 准备JSON文件
简单的软件配置文件:
{"app": {"name": "DemoSystem","version": "1.0.0","debug": true},"server": {"host": "127.0.0.1","port": 8000},"users": [{"name": "Tom","role": "admin","active": true},{"name": "Jerry","role": "operator","active": false}]}
这个 JSON 文件整体是一个 对象,最外层用 {} 包起来。
你可以先把它理解成:
一个总的数据包,里面分成三块:1. app:软件信息2. server:服务器信息3. users:用户列表
变成 Python 字典,等价于:data = {"app": {"name": "DemoSystem","version": "1.0.0","debug": True},"server": {"host": "127.0.0.1","port": 8000},"users": [{"name": "Tom","role": "admin","active": True},{"name": "Jerry","role": "operator","active": False}]}
最外层的{}包起来的,这就是一个典型的字典,字典里面有三组键值对:
{"app": {...},"server": {...},"users": [...]}
我们这里的值又可以是字典、列表;列表里面又可以包字典。
004 读取 JSON 文件
# 导入 Python 自带的 json 模块# json 模块专门用来处理 JSON 数据# 比如:把 JSON 字符串转换成 Python 字典,或者把 Python 字典转换成 JSON 字符串import json# 从 pathlib 模块中导入 Path# Path 用来处理文件路径,比直接写字符串路径更方便from pathlib import Path# 创建一个 Path 对象,表示当前目录下的 config.json 文件# 注意:这里只是表示这个文件路径,还没有真正读取文件内容file_path = Path("config.json")# 读取 config.json 文件中的文本内容# encoding="utf-8" 表示使用 UTF-8 编码读取文件# 如果 JSON 文件中有中文,建议加上 encoding="utf-8",避免乱码# 读取完成后,text 是一个字符串类型的数据text = file_path.read_text(encoding="utf-8")# 把 JSON 字符串转换成 Python 数据# 如果 JSON 最外层是 { },转换后通常就是 Python 字典 dict# 如果 JSON 最外层是 [ ],转换后通常就是 Python 列表 list# 这里 config.json 最外层一般是 { },所以 data 通常是 dict 类型data = json.loads(text)# 打印 data 的数据类型# 用来确认 json.loads() 转换后的结果是什么类型# 常见输出:<class 'dict'>print(type(data))# 打印转换后的数据内容# 此时 data 已经不是 JSON 字符串,而是 Python 可以直接操作的数据对象# 如果 data 是字典,就可以使用 data["key"] 的方式取值print(data)


005 读取字典里的值
# data["app"] 先取出 app 这一层字典# data["app"]["name"] 再从 app 字典里取出 name 的值# 例如取到的结果可能是:"DemoSystem"app_name = data["app"]["name"]# data["app"] 取出 app 字典# ["version"] 取出版本号# 例如取到的结果可能是:"1.0.0"version = data["app"]["version"]# data["server"] 先取出 server 这一层字典# data["server"]["host"] 再从 server 字典里取出 host 的值# 例如取到的结果可能是:"127.0.0.1"host = data["server"]["host"]# 略port = data["server"]["port"]# 打印软件名称print(app_name)# 打印版本号print(version)# 打印服务器地址print(host)# 打印服务器端口print(port)

006 读取列表数据
users = data["users"]first_user = users[0]print(first_user["name"])print(first_user["role"])print(first_user["active"])
data["users"] 是一个列表。users[0] 是列表里的第一个用户。users[0]["name"] 是第一个用户的名字。
也可以循环读取:
for user in data["users"]:print(user["name"], user["role"], user["active"])
007 修改 dict 中的数据
data["app"]["debug"] = Falsedata["server"]["port"] = 9000data["users"][1]["active"] = True
这里修改的是 Python 内存里的 dict。此时 config.json 文件本身还没有变化。要想真正保存到文件,需要再写回 JSON。
008 保存回 JSON 文件
new_text = json.dumps(data, ensure_ascii=False, indent=2)Path("config.json").write_text(new_text, encoding="utf-8")
json.dumps() 把 dict 转成 JSON 字符串。ensure_ascii=False 用来保证中文正常显示。indent=2 让 JSON 文件格式更清晰。write_text() 把 JSON 字符串写入文件。

!负步长FOR循环:当有一条新报警触发时,把这条新报警插到历史数组第 1 位,原来的历史记录整体往后挪一格。
收藏!倍福EL2502,两路PWM模块测试随笔。附24V PWM信号转5V PWM信号介绍。