Python JSON 解析:序列化和反序列化
了解如何在 Python 中读取、写入和解析 JSON 数据。掌握 json.loads、json.dumps 和自定义 JSON 编码器/解码器。
概述
JSON(JavaScript 对象表示法)是一种轻量级数据交换格式,主导着现代 Web API、配置和数据库负载。由于 JSON 结构类似于 Python 字典和列表,因此它们之间的转换非常无缝。 Python 配备了内置的“json”模块,可以轻松地将 JSON 字符串解析为 Python 对象,并将 Python 对象转换回 JSON 字符串。
将 Python 对象(如字典)转换为原始 JSON 字符串的过程称为序列化或编码。这是由 `json.dumps()` (对于字符串)和 `json.dump()` (对于直接写入文件)处理的。您可以控制格式参数,例如“indent”来美化 JSON,或“sort_keys”来保持属性按字母顺序排序。相反,将 JSON 字符串解析为 Python 字典称为反序列化,通过 json.loads() 和 json.load() 执行。
虽然字符串、数字、列表和字典等标准 Python 类型会自动序列化为 JSON,但自定义对象(如类或日期时间对象)却不会。尝试直接编码自定义对象将引发“TypeError”。为了克服这个问题,开发人员必须创建一个继承自“json.JSONEncoder”的自定义编码器类,并重写“.default()”方法以将类序列化为可读的字典。掌握 JSON 操作是与外部 Web 服务通信的关键。
代码和执行输出
将字典转换为 JSON 字符串并使用内置 json 库将其解析回来。
import json
# Python Dictionary representing a user profile
user_profile = {
"name": "Alex",
"is_premium": True,
"skills": ["Python", "Docker"],
"age": 28
}
# Serialize dictionary to JSON string
json_string = json.dumps(user_profile, indent=2)
print("--- JSON String ---")
print(json_string)
# Deserialize JSON string back to dictionary
parsed_dict = json.loads(json_string)
print("\n--- Parsed Python Dictionary ---")
print(f"Name: {parsed_dict['name']}")
print(f"First Skill: {parsed_dict['skills'][0]}")--- JSON String ---
{
"name": "Alex",
"is_premium": true,
"skills": [
"Python",
"Docker"
],
"age": 28
}
--- Parsed Python Dictionary ---
Name: Alex
First Skill: Python逐步实施
- 发送有效负载并从 REST API 读取数据
- 将配置首选项存储在 settings.json 文件中
- 在微服务之间传递结构化负载
常见问题解答
json.dump 和 json.dumps 有什么区别?
json.dump(不带“s”)将 JSON 数据直接写入文件流。 json.dumps(带有“s”)将数据序列化为 Python 字符串变量。
如何处理 JSON 解码错误?
将解析代码包装在捕获“json.JSONDecodeError”的 try/ except 块中,以优雅地处理格式错误的 JSON 字符串。
相关主题
推荐的 Python 资源
通过相关的交互式教程、备忘单和代码比较来扩展您的知识。