内容目录
原文链接:http://www.juzicode.com/python-module-json/
json 是 Python 标准库中用于处理 JSON 格式数据的模块,提供数据序列化与反序列化功能。支持字典、列表等基础类型转换,适用于配置文件读写、API 数据交互和跨平台数据交换等场景。
应用场景
- API 开发:序列化 Python 对象为 JSON 响应
- 配置文件:读写 JSON 格式的配置信息
- 数据存储:保存结构化数据到文件
- 数据清洗:转换不同系统的数据格式
安装或导入
Python 内置标准库,直接导入使用:
import json
基本用法
以下示例展示 JSON 编码与解码的核心操作,涵盖基础类型转换和文件操作。
1. 字典转 JSON 字符串
使用 dumps() 将 Python 字典转换为 JSON 字符串。ensure_ascii 参数可禁用 ASCII 转义。
#juzicode.com/VX公众号:juzicode
import json
data = {"name": "张三", "age": 30, "skills": ["Python", "SQL"]}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
运行结果:
{"name": "张三", "age": 30, "skills": ["Python", "SQL"]}
2. JSON 字符串转字典
使用 loads() 解析 JSON 字符串为 Python 对象。自动转换 JSON 类型到对应的 Python 类型。
#juzicode.com/VX公众号:juzicode
json_str = '{"city": "北京", "population": 2154}'
data = json.loads(json_str)
print(data["city"])
运行结果:
北京
3. 读写 JSON 文件
通过 dump() 和 load() 实现文件持久化。indent 参数可美化输出格式。
#juzicode.com/VX公众号:juzicode
# 写入文件
data = {"key": "value"}
with open("data.json", "w") as f:
json.dump(data, f, indent=4)
# 读取文件
with open("data.json") as f:
loaded = json.load(f)
print(loaded)
运行结果:
{'key': 'value'}
4. 处理嵌套结构
自动转换嵌套的字典和列表结构。JSON 数组对应 Python 列表,对象对应字典。
#juzicode.com/VX公众号:juzicode
json_str = '''
{
"users": [
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 30}
]
}'''
data = json.loads(json_str)
print(data["users"][0]["name"])
运行结果:
Alice
5. 处理特殊类型
默认不支持 datetime 等特殊类型,需自定义处理。通过 default 参数指定序列化函数。
#juzicode.com/VX公众号:juzicode
from datetime import datetime
def default_serializer(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError("Type not serializable")
data = {"time": datetime.now()}
json_str = json.dumps(data, default=default_serializer)
print(json_str)
运行结果:
{"time": "2023-10-05T14:30:00.123456"}
高级功能
以下示例展示 JSON 模块的进阶用法,处理复杂序列化需求和性能优化。
1. 自定义编码器
继承 JSONEncoder 处理自定义对象。需实现 default() 方法定义序列化逻辑。
#juzicode.com/VX公众号:juzicode
class User:
def __init__(self, name):
self.name = name
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, User):
return {"username": obj.name}
return super().default(obj)
user = User("John")
print(json.dumps(user, cls=CustomEncoder))
运行结果:
{"username": "John"}
2. 解析钩子函数
通过 object_hook 在解析时转换字典对象。常用于将 JSON 数据映射到自定义类实例。
#juzicode.com/VX公众号:juzicode
def hook_func(dct):
if "username" in dct:
return User(dct["username"])
return dct
json_str = '{"username": "Alice"}'
user = json.loads(json_str, object_hook=hook_func)
print(type(user).__name__)
运行结果:
User
3. 压缩 JSON 输出
通过 separators 参数移除空白字符。减少 JSON 体积,适合网络传输。
#juzicode.com/VX公众号:juzicode
data = {"a": 1, "b": 2}
json_str = json.dumps(data, separators=(',', ':'))
print(json_str)
运行结果:
{"a":1,"b":2}
4. 自定义排序键
通过 sort_keys 参数控制输出顺序。保证序列化结果的确定性。
#juzicode.com/VX公众号:juzicode
data = {"c": 3, "a": 1, "b": 2}
json_str = json.dumps(data, sort_keys=True)
print(json_str)
运行结果:
{"a": 1, "b": 2, "c": 3}
总结
json 模块的核心优势包括:
- 支持标准 JSON 规范
- 简单易用的 API 设计
- 灵活的类型扩展机制
- 高效的大数据处理能力
该模块是 Python 数据交换的基石工具,通过合理使用序列化参数和自定义处理逻辑,可以满足从基础到复杂的各种 JSON 处理需求。