简介
JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种轻量级的数据交换格式,广泛用于配置文件和 API 通信。
Shell 工具非常适合处理纯文本,但对于 JSON 这样的结构化格式,使用 Python 内置库通常更容易操作,也更安全。
在本实验中,你将扮演一名需要更新应用配置的开发者。你将创建一个 JSON 配置文件,编写 Python 脚本加载该文件,修改其中的设置,然后将更改保存到新文件中。
创建示例数据
在本步骤中,你将创建一个示例 JSON 配置文件。该文件模拟软件应用的典型设置文件,其中包含应用名称、版本、调试模式和连接数限制等键。
首先,确认当前位于正确的工作目录:
JSON 是现代运维中最常见的结构化数据格式之一,因为 API、云工具和许多配置系统都使用它。学习如何安全地读取和修改 JSON,比把它当作纯文本处理更有价值。
cd ~/project
接下来,使用 nano 等文本编辑器创建名为 config.json 的文件。
nano config.json
将以下内容粘贴到文件中。这个 JSON 对象包含一个布尔值(false)、一个整数(100)和多个字符串。
{
"appName": "SuperApp",
"version": "1.0.0",
"debug": false,
"maxConnections": 100
}
保存并退出 nano:
按 Ctrl + O 写入更改,然后按 Enter 确认文件名。接着按 Ctrl + X 退出编辑器。
你可以使用 cat 命令验证文件内容:
cat config.json
终端中应该会显示该 JSON 内容。
读取 JSON
在本步骤中,你将编写一个 Python 脚本来读取 config.json 文件。Python 的 json 模块会将 JSON 数据转换为 Python 字典。
与基础 Shell 脚本相比,Python 在这里具有明显优势。你不需要使用正则表达式搜索文本,也不必担心文件结构是否足够简单;Python 可以按照 JSON 规则解析文件,并提供真正的数据类型供代码使用。
可以把 json.load() 理解为「拆开运输箱」:它会读取文件中存储的文本(箱子),将其转换为 Python 字典(箱内物品),方便你在代码中使用和修改。
创建一个名为 parse_json.py 的新 Python 脚本:
nano parse_json.py
将以下代码添加到文件中。该脚本会导入 json 模块,打开配置文件并加载其中的数据。
import json
## Open the JSON file
with open('config.json', 'r') as file:
## Load the data into a Python dictionary
data = json.load(file)
## Print the data to verify it was loaded correctly
print("Current Configuration:")
print(data)
print(f"Type of data: {type(data)}")
保存并退出 nano(Ctrl+O、Enter、Ctrl+X)。
现在运行脚本,查看输出:
python3 parse_json.py
你应该会看到以字典形式打印的数据,这表示 Python 已成功解析 JSON 文件。
修改数据
在本步骤中,你将在 Python 脚本中修改已加载的数据。由于 json.load() 会将数据转换为标准 Python 字典,因此你可以像修改其他字典一样修改其中的值。
注意这里发生的类型转换:JSON 中的 true 和 false 会转换为 Python 中的 True 和 False。数字仍然保持数字类型,而不会变成普通字符串。这样可以让后续的比较和计算更加安全。
再次打开 parse_json.py 进行编辑:
nano parse_json.py
将 debug 键的值从 False(对应 JSON 中的 false)修改为 True。请将修改逻辑添加在数据加载完成之后、打印数据之前。
将代码更新为以下内容:
import json
with open('config.json', 'r') as file:
data = json.load(file)
print("Original Debug Status:", data['debug'])
## Modify the value
data['debug'] = True
print("Updated Debug Status:", data['debug'])
保存并退出 nano。
再次运行脚本,验证内存中的更改:
python3 parse_json.py
你应该会看到原始状态为 False,更新后的状态为 True。请注意,此时更改只存在于 Python 程序的内存中,还没有保存到文件。
保存更改
在本步骤中,你将把修改后的字典保存到新的 JSON 文件中。这里使用 json.dump() 函数完成保存。
「读取、修改、写入」是自动化中非常常见的模式。脚本会加载结构化数据,只修改指定字段,然后写回有效的 JSON。当文件结构变得更加复杂时,这种方式比按行编辑可靠得多。
可以把 json.dump() 理解为「重新装箱」:它会将 Python 字典(物品)转换回文本格式(封好的箱子),以便存储到文件中。测试期间,最好将内容保存到新文件(例如 new_config.json),避免覆盖原始配置。
最后一次打开 parse_json.py:
nano parse_json.py
添加代码,将 data 字典写入名为 new_config.json 的文件。这里使用 indent=4 参数,让输出文件更易于阅读(格式化输出)。
最终脚本应如下所示:
import json
## 1. Read the original file
with open('config.json', 'r') as file:
data = json.load(file)
## 2. Modify the data
data['debug'] = True
## 3. Write to a new file
with open('new_config.json', 'w') as file:
json.dump(data, file, indent=4)
print("Configuration updated and saved to new_config.json")
保存并退出 nano。
运行脚本,执行读取、修改和写入操作:
python3 parse_json.py
如果操作成功,脚本会打印确认消息。
验证结果
在本步骤中,你将验证新的配置文件是否已创建,并确认其中包含更新后的值。
对于结构化文件,验证尤其重要,因为脚本即使在语法层面成功运行,也可能生成逻辑内容错误的文件。重新读取输出内容,可以同时确认文件已创建以及数据修改正确。
列出当前目录中的文件,确认 new_config.json 存在:
ls -l
现在显示新文件的内容:
cat new_config.json
你应该会看到类似以下内容的输出:
{
"appName": "SuperApp",
"version": "1.0.0",
"debug": true,
"maxConnections": 100
}
注意,"debug" 现在的值是 true。
你还可以使用 diff 命令比较原始文件和新文件,准确查看发生了什么变化:
diff config.json new_config.json
输出会突出显示两行 debug 内容之间的差异。
总结
在本实验中,你已经学会如何使用 Python 处理 JSON 数据。你先创建了一个原始 JSON 配置文件,然后编写 Python 脚本,将该文件解析为字典。接着,你以编程方式修改数据,并将更新后的结构保存到新的 JSON 文件中。
「读取、修改、写入」这一工作流是自动化和 DevOps 脚本中的基础模式。Bash 非常适合运行命令,而 Python 处理 JSON 等结构化数据的能力,使其成为管理复杂配置和 API 数据的强大工具。



