JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,Python 的 json 模块提供了 JSON 数据的编码和解码功能。
基本用法
1. 导入模块
import json2. JSON 编码(Python对象 → JSON字符串)
# Python 数据类型
data = {
"name": "张三",
"age": 25,
"is_student": False,
"hobbies": ["读书", "游泳", "编程"],
"address": {
"city": "北京",
"zipcode": "100000"
}
}
# 转换为 JSON 字符串
json_str = json.dumps(data, ensure_ascii=False, indent=4)
print(json_str)输出:
{
"name": "张三",
"age": 25,
"is_student": false,
"hobbies": [
"读书",
"游泳",
"编程"
],
"address": {
"city": "北京",
"zipcode": "100000"
}
}3. JSON 解码(JSON字符串 → Python对象)
# JSON 字符串
json_data = '{"name": "李四", "age": 30, "city": "上海"}'
# 转换为 Python 字典
python_dict = json.loads(json_data)
print(python_dict)
print(type(python_dict))输出:
{'name': '李四', 'age': 30, 'city': '上海'}
<class 'dict'>文件操作
写入 JSON 文件
data = {
"name": "王五",
"age": 28,
"email": "wangwu@example.com"
}
# 写入文件
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)读取 JSON 文件
# 从文件读取
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(data)常用参数说明
json.dumps() 参数
ensure_ascii: 是否确保ASCII编码(设为False可正确显示中文)indent: 缩进空格数,用于美化输出sort_keys: 是否按键排序separators: 分隔符设置
json.loads() 参数
parse_float: 指定浮点数解析函数parse_int: 指定整数解析函数parse_constant: 指定常量解析函数
高级用法
自定义对象序列化
class User:
def __init__(self, name, age):
self.name = name
self.age = age
# 自定义序列化函数
def user_encoder(obj):
if isinstance(obj, User):
return {'name': obj.name, 'age': obj.age, '__class__': 'User'}
raise TypeError(f'Object of type {obj.__class__.__name__} is not JSON serializable')
# 自定义反序列化函数
def user_decoder(dct):
if '__class__' in dct and dct['__class__'] == 'User':
return User(dct['name'], dct['age'])
return dct
# 使用自定义编码器
user = User("赵六", 35)
json_str = json.dumps(user, default=user_encoder, ensure_ascii=False)
print(json_str)
# 使用自定义解码器
user_obj = json.loads(json_str, object_hook=user_decoder)
print(type(user_obj), user_obj.name, user_obj.age)处理日期时间
from datetime import datetime
def datetime_encoder(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError("Type not serializable")
def datetime_decoder(dct):
for key, value in dct.items():
if isinstance(value, str):
try:
dct[key] = datetime.fromisoformat(value)
except:
pass
return dct
data = {
"event": "会议",
"time": datetime.now()
}
json_str = json.dumps(data, default=datetime_encoder, ensure_ascii=False)
print(json_str)
data_restored = json.loads(json_str, object_hook=datetime_decoder)
print(data_restored)错误处理
# 处理 JSON 解析错误
invalid_json = '{name: "测试", age: 25}' # 缺少引号
try:
data = json.loads(invalid_json)
except json.JSONDecodeError as e:
print(f"JSON 解析错误: {e}")
print(f"错误位置: 第{e.lineno}行, 第{e.colno}列")性能优化
对于大型 JSON 数据,可以使用 ijson 库进行流式处理:
# 安装: pip install ijson
import ijson
# 流式处理大型 JSON 文件
with open('large_file.json', 'r') as f:
parser = ijson.parse(f)
for prefix, event, value in parser:
print(f"prefix: {prefix}, event: {event}, value: {value}")总结
Python 的 json 模块提供了:
- 简单易用的 JSON 编码解码功能
- 支持文件读写操作
- 丰富的参数配置
- 支持自定义对象的序列化
- 良好的错误处理机制
对于大多数应用场景,json 模块都能提供稳定可靠的数据交换解决方案。
















