在 Python 中,读取和解析 JSON 数据是一项非常常见的任务。JSON 格式(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时易于机器解析和生成。Python 内置的 json
模块可以轻松地处理 JSON 数据,无论是从文件中读取 JSON,还是从字符串中解析 JSON,都是相当直接的。
json
模块的基本功能
json
模块提供了一些核心函数:
json.load(f)
:从文件对象f
中读取并解析 JSON 数据。json.loads(s)
:从字符串s
中解析 JSON 数据。json.dump(obj, f)
:将 Python 对象obj
写入到文件f
中,作为 JSON 格式的数据。json.dumps(obj)
:将 Python 对象obj
转换为 JSON 格式的字符串。
读取和解析 JSON 数据的基本步骤
为了展示如何使用 json
模块读取和解析 JSON 数据,我们可以用一个简单的例子来说明如何从文件中读取 JSON 数据并解析成 Python 对象。假设我们有一个名为 data.json
的文件,内容如下:
{
"name": "John",
"age": 30,
"city": "New York",
"children": [
{
"name": "Jane",
"age": 10
},
{
"name": "Doe",
"age": 8
}
]
}
这个文件存储了一个人的基本信息,其中包括他的名字、年龄、城市以及两个孩子的信息。接下来我们会用 Python 来读取这个文件,并解析其内容。
示例代码:从文件读取 JSON 数据并解析
以下是读取 data.json
文件并解析其内容的完整 Python 代码示例:
import json
# 定义要读取的文件路径
file_path = 'data.json'
# 打开并读取文件内容
with open(file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
# 输出解析后的数据
print(data)
# 访问 JSON 数据中的各个字段
print(f"Name: {data['name']}")
print(f"Age: {data['age']}")
print(f"City: {data['city']}")
# 遍历孩子的信息
for child in data['children']:
print(f"Child Name: {child['name']}, Age: {child['age']}")
代码分析
import json
:导入json
模块,它是处理 JSON 数据的核心工具。with open(file_path, 'r', encoding='utf-8') as file
:使用with
语句打开文件,这是一种 Python 中常见的文件操作模式,保证文件会在操作结束后自动关闭。我们以utf-8
编码读取文件,以防止编码问题。json.load(file)
:将文件对象传递给json.load()
函数,读取并解析文件内容为 Python 的字典或列表。print(data)
:输出整个解析后的 JSON 数据,它现在是一个 Python 的字典。- 通过
data['name']
,data['age']
等方式访问 JSON 对象的字段。这是字典的典型操作方式。 - 使用
for
循环遍历data['children']
,访问孩子的信息。
解析 JSON 字符串
有时候 JSON 数据可能直接以字符串的形式提供,而不是存储在文件中。我们可以使用 json.loads()
来解析字符串形式的 JSON 数据。
假设我们有一个 JSON 字符串:
json_string = '{"name": "Alice", "age": 25, "city": "London"}'
我们可以使用以下代码解析这个字符串:
import json
# 定义 JSON 字符串
json_string = '{"name": "Alice", "age": 25, "city": "London"}'
# 解析 JSON 字符串
data = json.loads(json_string)
# 输出解析后的数据
print(data)
# 访问数据中的字段
print(f"Name: {data['name']}")
print(f"Age: {data['age']}")
print(f"City: {data['city']}")
这段代码与从文件读取的方式非常类似,只是这里我们将 JSON 字符串直接传递给 json.loads()
函数。
JSON 写入文件
Python 也可以很方便地将数据写入到 JSON 文件中,使用 json.dump()
函数可以将 Python 对象转换为 JSON 格式并写入文件。假设我们有以下 Python 数据:
person = {
"name": "Bob",
"age": 40,
"city": "Chicago",
"children": [
{
"name": "Anna",
"age": 12
},
{
"name": "Tom",
"age": 7
}
]
}
我们可以将这个数据写入到 output.json
文件中,代码如下:
import json
# 定义 Python 对象
person = {
"name": "Bob",
"age": 40,
"city": "Chicago",
"children": [
{
"name": "Anna",
"age": 12
},
{
"name": "Tom",
"age": 7
}
]
}
# 将数据写入到文件
with open('output.json', 'w', encoding='utf-8') as file:
json.dump(person, file, ensure_ascii=False, indent=4)
代码分析
json.dump(person, file, ensure_ascii=False, indent=4)
:json.dump()
将 Python 对象写入文件。ensure_ascii=False
确保非 ASCII 字符能够被正确处理,比如中文字符。indent=4
参数用于美化输出,使得生成的 JSON 文件更易于阅读。- 文件会自动写入
output.json
中,内容格式化后的样子如下:
{
"name": "Bob",
"age": 40,
"city": "Chicago",
"children": [
{
"name": "Anna",
"age": 12
},
{
"name": "Tom",
"age": 7
}
]
}
处理复杂的 JSON 结构
在实际应用中,JSON 数据的结构可能非常复杂,嵌套多个层次的对象和数组。在这种情况下,Python 的 json
模块依旧能够轻松处理。例如,我们有一个包含更复杂数据结构的 JSON:
{
"status": "success",
"data": {
"users": [
{
"id": 1,
"name": "Alice",
"emails": ["alice@example.com", "alice.work@example.com"]
},
{
"id": 2,
"name": "Bob",
"emails": ["bob@example.com"]
}
]
},
"meta": {
"count": 2
}
}
解析并提取这些复杂数据的代码如下:
import json
# 定义要解析的 JSON 数据
json_data = '''
{
"status": "success",
"data": {
"users": [
{
"id": 1,
"name": "Alice",
"emails": ["alice@example.com", "alice.work@example.com"]
},
{
"id": 2,
"name": "Bob",
"emails": ["bob@example.com"]
}
]
},
"meta": {
"count": 2
}
}
'''
# 解析 JSON 数据
data = json.loads(json_data)
# 输出用户数据
for user in data['data']['users']:
print(f"User ID: {user['id']}, Name: {user['name']}")
print("Emails:")
for email in user['emails']:
print(f" {email}")
# 输出 meta 数据
print(f"Total user count: {data['meta']['count']}")
错误处理
在处理 JSON 数据时,可能会遇到格式错误或数据缺失的问题。为了让程序更健壮,我们需要在解析 JSON 时捕获异常。json
模块的 JSONDecodeError
异常可以帮助我们处理解析错误:
import json
json_string = '{"name": "Alice", "age": 25, "city": "London"' # 缺少右括号
try:
data = json.loads(json_string)
except json.JSONDecodeError as e:
print(f"JSON Decode Error: {e}")
这里,json.loads()
试图解析一个格式不正确的 JSON 字符串,由于缺少右括号,它会抛出 JSONDecodeError
异常。通过捕获这个异常,我们可以为用户提供更友好的错误提示。
总结
无论是从文件中读取 JSON 数据,还是直接解析字符串形式的 JSON,Python 的 json
模块都提供了极为简便的操作方式。你可以通过 json.load()
从文件中读取 JSON,通过 json.loads()
解析 JSON 字符串,并且可以用 json.dump()
和 json.dumps()
将 Python 对象转化为 JSON 格式的数据。
通过这些示例代码,你可以处理简单到复杂的 JSON 结构,并且可以通过异常捕获提高程序的健壮性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。