Python3 JSON 数据解析:从入门到实战
在现代编程中,数据交换格式的选择至关重要。而 JSON(JavaScript Object Notation)凭借其轻量、易读、跨语言的特性,已经成为前后端通信、API 接口交互的标准格式之一。对于 Python 开发者来说,掌握 Python3 JSON 数据解析技能,是构建高效数据处理流程的必经之路。
Python3 内置了 json 模块,提供了完整且高效的 JSON 操作能力。无论你是初学者还是有一定经验的开发者,只要理解了基本原理,就能快速上手。本文将带你从零开始,系统性地学习 Python3 JSON 数据解析的核心知识,通过真实案例与代码实践,掌握解析、生成、错误处理等关键技巧。
什么是 JSON?为什么它如此流行?
JSON 是一种轻量级的数据交换格式,它的语法简洁,结构清晰。你可以把它想象成一个“数据信封”——把复杂的数据打包成一种标准化的形式,方便在不同系统之间传递。
一个典型的 JSON 示例:
{
"name": "张三",
"age": 28,
"is_student": false,
"hobbies": ["读书", "游泳", "编程"],
"address": {
"city": "北京",
"district": "朝阳区"
}
}
这个结构看起来像 Python 中的字典(dict),但它是纯文本格式,可以被任何支持 JSON 的语言读取。Python3 的 json 模块正是用来处理这种格式的“解码器”和“编码器”。
使用 json.loads() 解析 JSON 字符串
当你从网络请求、配置文件或数据库中获取到 JSON 数据时,它通常是以字符串形式存在的。这时就需要使用 json.loads() 方法将其转换为 Python 对象。
import json
json_string = '''
{
"name": "李四",
"age": 30,
"skills": ["Python", "Django", "REST API"],
"active": true
}
'''
data = json.loads(json_string)
print(type(data)) # <class 'dict'>
print(data["name"]) # 输出:李四
print(data["skills"]) # 输出:['Python', 'Django', 'REST API']
代码注释说明:
json.loads()接收一个 JSON 格式的字符串,返回对应的 Python 数据结构(如 dict、list、str、int、bool、None)。- 解析成功后,
data就是一个标准的 Python 字典,可以直接用字典语法访问键值。- 注意:JSON 中的
true转为 Python 的True,false转为False,null转为None。
使用 json.load() 从文件中读取 JSON 数据
实际项目中,JSON 数据往往保存在文件中(如 config.json 或 data.json)。这时可以使用 json.load() 方法直接从文件对象中读取并解析。
import json
with open("data.json", "r", encoding="utf-8") as file:
config_data = json.load(file)
print(config_data["version"]) # 输出:1.0
for user in config_data["users"]:
print(f"用户:{user['name']},邮箱:{user['email']}")
代码注释说明:
json.load()接收一个打开的文件对象,无需手动读取字符串。- 使用
with open()可确保文件正确关闭,避免资源泄漏。encoding="utf-8"保证中文字符不会乱码。- 通过
config_data["users"]获取列表,再遍历每个用户字典。
将 Python 对象转换为 JSON 字符串:json.dumps()
在某些场景下,你需要将 Python 数据结构(如字典、列表)转换为 JSON 字符串,以便写入文件或发送到服务器。
import json
user_data = {
"username": "alice",
"friends": ["bob", "charlie"],
"preferences": {
"theme": "dark",
"notifications": True
},
"score": 98.5,
"last_login": None
}
json_string = json.dumps(user_data, ensure_ascii=False, indent=2)
print(json_string)
输出结果:
{
"username": "alice",
"friends": [
"bob",
"charlie"
],
"preferences": {
"theme": "dark",
"notifications": true
},
"score": 98.5,
"last_login": null
}
代码注释说明:
json.dumps()将 Python 对象转换为 JSON 字符串。ensure_ascii=False保证中文字符不被转义为 Unicode(如\u4e2d),输出更可读。indent=2表示缩进两个空格,使输出格式美观,便于调试。None转为null,True转为true,False转为false,完全符合 JSON 规范。
处理嵌套结构与复杂数据
真实场景中,JSON 数据往往是多层嵌套的。比如一个订单系统,包含用户、商品、地址等多个层级。
import json
order_data = {
"order_id": "ORD20240501",
"customer": {
"name": "陈七",
"phone": "13800138000",
"address": {
"street": "朝阳路 123 号",
"city": "北京"
}
},
"items": [
{"product": "笔记本电脑", "price": 5999.0, "quantity": 1},
{"product": "鼠标", "price": 99.0, "quantity": 2}
],
"total": 6197.0,
"status": "已发货"
}
print(f"订单号:{order_data['order_id']}")
print(f"客户姓名:{order_data['customer']['name']}")
print(f"收货地址:{order_data['customer']['address']['street']},{order_data['customer']['address']['city']}")
print("商品清单:")
for item in order_data["items"]:
subtotal = item["price"] * item["quantity"]
print(f" - {item['product']} × {item['quantity']} = ¥{subtotal:.2f}")
代码注释说明:
- 嵌套访问使用多层键名,如
order_data['customer']['address']['city']。items是一个列表,可通过for循环遍历每个商品。- 使用格式化字符串
:.2f保证金额保留两位小数。
错误处理与常见问题排查
在实际开发中,JSON 数据可能格式错误或缺失。此时 json.loads() 会抛出 json.JSONDecodeError 异常。
import json
invalid_json = '{"name": "测试", "age": 25, "city": }' # 错误:缺少值
try:
data = json.loads(invalid_json)
except json.JSONDecodeError as e:
print(f"JSON 解析失败:{e}")
print(f"错误位置:第 {e.lineno} 行,第 {e.colno} 列")
代码注释说明:
- 使用
try-except捕获解析异常,防止程序崩溃。e.lineno和e.colno提供错误发生的精确位置,便于调试。- 常见错误包括:缺少引号、逗号缺失、括号不匹配、使用单引号等。
实用技巧:自定义序列化与编码选项
json.dumps() 支持多种参数,让你灵活控制输出格式。
| 参数 | 作用 | 示例 |
|---|---|---|
ensure_ascii=False |
保留中文字符,不转义 | json.dumps({"msg": "你好"}) → "你好" |
indent |
设置缩进空格数 | indent=4 输出更清晰 |
sort_keys=True |
按键名排序 | 键值对按字母顺序排列 |
separators |
自定义分隔符 | separators=(',', ':') |
import json
data = {"z": 1, "a": 2, "c": 3}
json_str = json.dumps(data, sort_keys=True, indent=2, ensure_ascii=False)
print(json_str)
输出:
{
"a": 2,
"c": 3,
"z": 1
}
代码注释说明:
sort_keys=True使键按字母顺序排列,适合用于生成一致的 JSON 输出。- 这些选项在配置文件、API 响应、日志记录等场景中非常实用。
结语
Python3 JSON 数据解析是 Python 开发中不可或缺的基础技能。无论是处理 API 返回数据、读写配置文件,还是构建数据接口,掌握 json.loads()、json.load()、json.dumps() 等核心方法,都能让你事半功倍。
从简单的键值对解析,到嵌套结构遍历,再到异常处理与格式优化,本文通过清晰的结构和真实代码示例,带你一步步掌握 Python3 JSON 数据解析的精髓。记住,理解数据结构是第一步,熟练使用工具是关键。
当你能自如地读取、处理、生成 JSON 数据时,你就迈出了构建现代应用的重要一步。继续练习,多写代码,让这些知识点真正成为你的“肌肉记忆”。