解析 JSON 数据

PythonBeginner
立即练习

简介

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 数据的强大工具。