Python3 JSON 数据解析(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言:为什么需要学习 JSON 数据解析?
在当今互联网时代,JSON(JavaScript Object Notation)已成为数据交换的通用语言。无论是 API 调用、配置文件存储,还是前后端数据交互,JSON 几乎无处不在。作为 Python 开发者,掌握 JSON 数据解析技能,能够显著提升处理网络数据、配置管理、数据持久化等场景的效率。Python 的 json
标准库提供了简洁高效的接口,使得 JSON 解析变得触手可及。本文将从零开始,通过案例和代码示例,带读者系统掌握 Python3 中的 JSON 解析技术。
一、JSON 基础:结构与语法解析
1.1 JSON 的核心概念
JSON 是一种轻量级的数据交换格式,其结构基于键值对(Key-Value),支持五种数据类型:
- 字符串(String)
- 数字(Number)
- 布尔值(Boolean)
- 数组(Array)
- 对象(Object)
- 空值(Null)
形象比喻:可以将 JSON 理解为一个“快递包裹”,其中:
- 键(Key) 是包裹上的标签,标识内容类型
- 值(Value) 是包裹内的具体物品
- 对象(Object) 是装有多个包裹的快递箱
- 数组(Array) 是一排按顺序排列的包裹架
示例 JSON 数据:
{
"name": "Alice",
"age": 30,
"is_student": false,
"courses": ["Math", "Physics"],
"address": {
"city": "Beijing",
"postal_code": "100000"
}
}
1.2 JSON 的语法要点
- 字符串必须使用双引号(
"
) - 键名必须用双引号包裹
- 对象内部以逗号分隔键值对
- 数组元素用逗号分隔
- 注释(
//
或/* */
)在标准 JSON 中不被支持
二、Python3 标准库 json
的核心功能
2.1 json
模块的两个核心函数
Python 的 json
模块提供了两个核心函数,用于实现 JSON 数据的序列化(Serialization)和反序列化(Deserialization):
json.dumps()
:将 Python 对象转换为 JSON 字符串json.loads()
:将 JSON 字符串解析为 Python 对象
核心逻辑对比表:
| 功能类型 | Python 对象 → JSON 字符串 | JSON 字符串 → Python 对象 |
|------------------|--------------------------|--------------------------|
| 对应函数 | json.dumps()
| json.loads()
|
| 数据流向 | 内存数据 → 网络传输 | 网络传输 → 内存数据 |
2.2 基础案例:对象与字符串的转换
import json
user_info = {
"name": "Bob",
"age": 25,
"hobbies": ["reading", "coding"],
"is_active": True
}
json_str = json.dumps(user_info, indent=4)
print("JSON 字符串:")
print(json_str)
parsed_dict = json.loads(json_str)
print("\n解析后的 Python 对象类型:", type(parsed_dict))
输出结果:
JSON 字符串:
{
"name": "Bob",
"age": 25,
"hobbies": ["reading", "coding"],
"is_active": true
}
解析后的 Python 对象类型: <class 'dict'>
三、进阶技巧:处理复杂数据结构
3.1 解析嵌套对象的技巧
当 JSON 数据包含多层嵌套时,可以通过链式访问提取数据。例如解析天气 API 响应:
weather_data = '''
{
"city": "Shanghai",
"weather": {
"temperature": 28,
"condition": "sunny",
"forecast": [
{"date": "2023-07-01", "high": 30},
{"date": "2023-07-02", "high": 29}
]
}
}
'''
weather_dict = json.loads(weather_data)
print("今日最高温度:", weather_dict["weather"]["forecast"][0]["high"])
输出结果:
今日最高温度: 30
3.2 自定义序列化与反序列化
当需要处理 Python 特有的数据类型(如日期、自定义对象)时,可通过 default
和 object_hook
参数实现扩展。
案例:序列化 datetime 对象
from datetime import datetime
def datetime_serializer(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError("Type not serializable")
now = datetime.now()
json_str = json.dumps(now, default=datetime_serializer)
print(json_str) # 输出类似:"2023-07-01T10:15:30.123456"
反序列化示例
def datetime_parser(json_dict):
for key, value in json_dict.items():
try:
json_dict[key] = datetime.fromisoformat(value)
except (TypeError, ValueError):
pass
return json_dict
parsed_dict = json.loads(json_str, object_hook=datetime_parser)
print(parsed_dict["date"]) # 输出 datetime 对象
四、异常处理与调试技巧
4.1 常见错误类型及解决方案
错误类型 | 产生原因 | 解决方案 |
---|---|---|
json.decoder.JSONDecodeError | JSON 字符串格式错误(如缺少引号) | 使用在线 JSON 校验工具(如 JSONLint) |
TypeError | 非 JSON 兼容的数据类型 | 实现 default 函数进行类型转换 |
KeyError | 访问不存在的键 | 使用 get() 方法或默认值处理 |
4.2 调试技巧:打印中间结果
在解析复杂 JSON 时,建议分步操作并打印中间结果:
raw_data = '{"a":1, "b": [2,3], "c": {"d":4}}'
step1 = json.loads(raw_data) # 基础解析
print("基础解析结果:", step1)
step2 = step1["c"]["d"] # 分步访问
print("目标值:", step2)
五、性能优化与最佳实践
5.1 优化序列化速度
- 禁用缩进与 ASCII 编码:生产环境建议关闭
indent
和ensure_ascii
参数
fast_json = json.dumps(data, separators=(',', ':'), ensure_ascii=False)
5.2 处理大文件的流式解析
对于超大 JSON 文件(如日志文件),使用 ijson
库实现流式解析:
import ijson
with open('large_file.json', 'rb') as file:
parser = ijson.parse(file)
for prefix, event, value in parser:
if (prefix, event) == ('items.item', 'start_map'):
print("新条目开始:", value)
六、实战案例:解析天气 API 数据
6.1 调用公开天气 API
import requests
response = requests.get("https://api.weatherapi.com/v1/current.json", params={
"key": "YOUR_API_KEY",
"q": "London"
})
weather_data = response.json() # 等价于 json.loads(response.text)
6.2 数据提取与展示
def display_weather(data):
location = data['location']['name']
temp_c = data['current']['temp_c']
condition = data['current']['condition']['text']
print(f"城市:{location}")
print(f"当前温度:{temp_c}°C")
print(f"天气状况:{condition}")
display_weather(weather_data)
输出示例:
城市:London
当前温度:18.5°C
天气状况:Partly cloudy
结论:掌握 JSON 解析的核心价值
通过本文的系统学习,读者已掌握了从基础语法到进阶技巧的完整知识体系。JSON 解析能力不仅是 Python 开发者的必备技能,更是连接前后端、处理云端数据的核心桥梁。建议读者通过以下方式巩固知识:
- 实践解析真实 API 返回的数据
- 尝试将 CSV 文件转换为 JSON 格式
- 优化现有代码中的 JSON 处理逻辑
在数字化时代,数据解析能力如同“语言翻译官”,帮助开发者跨越不同系统间的沟通障碍。希望本文能成为您技术成长路上的实用指南,助力您在数据处理领域游刃有余。