介绍
JSON(JavaScript Object Notation)是一种流行的数据格式,用于以序列化和人类可读的形式存储数据。它通常用于在服务器和 Web 应用程序之间传输数据,也是存储 NoSQL 数据库中数据的一个绝佳选择。在 Python 中,我们可以使用json模块来处理 JSON 数据。
学习目标
- 读取和写入 JSON 文件
- 序列化和反序列化 JSON 数据
JSON 简介
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。它基于 JavaScript 编程语言的一个子集,即 ECMA-262 第 3 版标准(1999 年 12 月)。JSON 是一种完全独立于语言的文本格式,但使用了与 C 语言家族(包括 C、C++、C#、Java、JavaScript、Perl、Python 等)程序员熟悉的约定。这些特性使 JSON 成为理想的数据交换语言。
JSON 的基本结构由对象(键值对的集合)和数组(值的有序列表)组成。
以下是一个 JSON 对象的示例:
{
"name": "Alice",
"age": 26,
"city": "New York"
}
这个 JSON 对象包含三个键值对:
- "name" : "Alice"
- "age" : 26
- "city" : "New York"
以下是一个 JSON 数组的示例:
["apple", "banana", "cherry"]
这个 JSON 数组包含三个值:"apple"、"banana" 和 "cherry"。
一个 JSON 对象可以包含多个键值对和数组,而一个 JSON 数组可以包含多个对象和数组。以下是一个更复杂的 JSON 结构示例:
{
"employees": [
{ "firstName": "John", "lastName": "Doe" },
{ "firstName": "Anna", "lastName": "Smith" },
{ "firstName": "Peter", "lastName": "Jones" }
],
"owners": [
{ "name": "Alice", "age": 30 },
{ "name": "Bob", "age": 35 }
],
"office": {
"name": "Acme Inc.",
"location": "New York"
}
}
这个 JSON 对象包含三个键值对:
- "employees" : 一个员工对象数组
- "owners" : 一个所有者对象数组
- "office" : 一个办公室对象
Json 模块
要在 Python 中解析 JSON 对象,我们可以使用 json 模块。json 模块是 Python 标准库的一部分,因此我们不需要单独安装它。
打开一个新的 Python 解释器会话并输入以下代码:
python3
以下是如何解析上一个示例中的 JSON 对象的示例:
import json
json_strings = '{"employees": [{ "firstName": "John", "lastName": "Doe"}, ], "owners": [{ "name": "Alice", "age": 30 }, { "name": "Bob", "age": 35 }], "office": {"name": "Acme Inc."}}'
## 解析 JSON 对象
data = json.loads(json_strings)
## 访问数据
employees = data['employees']
owners = data['owners']
office = data['office']
## 打印数据
print(employees)
print(owners)
print(office)
这将输出以下内容:
[{'firstName': 'John', 'lastName': 'Doe'}]
[{'name': 'Alice', 'age': 30}, { "name": "Bob", "age": 35 }]
{'name': 'Acme Inc.'}
然后,你可以像使用 Python 字典或列表一样,使用键和索引访问 JSON 对象中的数据。例如,要访问第一个员工的名字,可以使用以下代码:
first_employee = employees[0]
first_name = first_employee['firstName']
print(first_name)
这将输出以下内容:
John
你还可以遍历数组并访问每个元素的数据。例如,要打印每个所有者的姓名和年龄,可以使用以下代码:
for owner in owners:
name = owner['name']
age = owner['age']
print(f'{name} is {age} years old.')
这将输出以下内容:
Alice is 30 years old.
Bob is 35 years old.
读取 JSON 文件
让我们从读取一个 JSON 文件开始。假设我们有一个文件 employees.json,其内容如下:
{
"employees": [
{
"firstName": "John",
"lastName": "Doe"
},
{
"firstName": "Anna",
"lastName": "Smith"
},
{
"firstName": "Peter",
"lastName": "Jones"
}
]
}
employees.json 文件已经存在于 /home/labex/project 目录中。
要在 Python 中读取此文件,我们可以使用以下代码:
import json
## 打开文件
with open('/home/labex/project/employees.json', 'r') as file:
## 将文件内容加载到变量中
data = json.load(file)
## 打印文件内容
print(data)
这将输出以下内容:
{'employees': [{'firstName': 'John', 'lastName': 'Doe'}, {'firstName': 'Anna', 'lastName': 'Smith'}, {'firstName': 'Peter', 'lastName': 'Jones'}]}
我们可以通过使用 JSON 对象的键来访问文件中的数据,就像使用 Python 字典一样。例如,要访问员工列表,我们可以使用 employees 键:
employees = data['employees']
print(employees)
这将输出以下内容:
[{'firstName': 'John', 'lastName': 'Doe'}, {'firstName': 'Anna', 'lastName': 'Smith'}, {'firstName': 'Peter', 'lastName': 'Jones'}]
我们还可以遍历员工列表并打印他们的姓名:
for employee in employees:
print(employee['firstName'], employee['lastName'])
这将输出以下内容:
John Doe
Anna Smith
Peter Jones
写入 JSON 文件
现在我们已经知道如何读取 JSON 文件,接下来让我们学习如何写入 JSON 文件。我们可以使用 json.dump() 函数将数据写入 JSON 文件。
假设我们有一个包含学生信息的字典列表。我们可以将这些数据写入名为 students.json 的文件中,如下所示:
import json
## 一个字典列表
students = [
{ "name": "Alice", "age": 26, "major": "Computer Science" },
{ "name": "Bob", "age": 27, "major": "Economics" },
{ "name": "Charlie", "age": 25, "major": "Physics" }
]
## 打开文件
with open('students.json', 'w') as file:
## 将数据写入文件
json.dump(students, file)
现在让我们验证数据是否正确写入:
with open('students.json', 'r') as file:
data = json.load(file)
print(data)
这将输出以下内容:
[
{ "name": "Alice", "age": 26, "major": "Computer Science" },
{ "name": "Bob", "age": 27, "major": "Economics" },
{ "name": "Charlie", "age": 25, "major": "Physics" }
]
我们还可以使用 json.dumps() 函数将 Python 对象转换为 JSON 字符串,然后将其保存到文件中或通过网络发送。以下是一个示例:
## 将字典列表转换为 JSON 字符串
json_string = json.dumps(students)
print(json_string)
## 将字符串保存到文件中
with open('students.json', 'w') as file:
file.write(json_string)
## 现在让我们验证数据是否正确写入
with open('students.json', 'r') as file:
data = json.load(file)
print(data)
这将产生与上一个示例相同的输出。
Python 对象与 JSON 字符串
Python 对象是以列表、字典等形式存储在内存中的数据集合。而 JSON 字符串则是 JSON 对象的序列化表示形式。它是一个表示 JSON 对象中数据的字符序列,但并未以实际对象的形式存储在内存中。
以下是如何使用 read() 函数读取 students.json 文件内容的示例:
with open('students.json', 'r') as file:
json_string = file.read()
print(json_string)
这将输出以下内容:
[{"name": "Alice", "age": 26, "major": "Computer Science"}, {"name": "Bob", "age": 27, "major": "Economics"}, {"name": "Charlie", "age": 25, "major": "Physics"}]
当你尝试获取 json_string 的第一个元素时,你会得到字符串的第一个字符:
print(json_string[0])
[
这是因为 json_string 是一个字符串,而不是一个列表(Python 对象)。要将其转换为列表,我们可以使用 json.loads() 函数:
import json
## 将 JSON 字符串转换为 Python 对象
python_object = json.loads(json_string)
print(python_object)
输出与上述内容类似,区别在于单引号和双引号的使用:
[{'name': 'Alice', 'age': 26, 'major': 'Computer Science'}, {'name': 'Bob', 'age': 27, 'major': 'Economics'}, {'name': 'Charlie', 'age': 25, 'major': 'Physics'}]
现在我们可以访问列表的第一个元素:
print(python_object[0])
{ "name": "Alice", "age": 26, "major": "Computer Science" }
初学者常常会混淆 Python 对象和 JSON 字符串,因此需要特别注意。
总结
恭喜!你已经完成了关于 JSON 文件的实验。你学会了如何在 Python 中读取和写入 JSON 文件,同时也掌握了如何在 Python 中处理 JSON 数据。



