一、json庫概述
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,Python的json
模塊提供了JSON數據的編碼和解碼功能。該模塊可以將Python對象轉換為JSON字符串(序列化),也可以將JSON字符串轉換為Python對象(反序列化)。
核心功能
json.dumps()
: 將Python對象編碼為JSON字符串json.loads()
: 將JSON字符串解碼為Python對象json.dump()
: 將Python對象編碼并寫入文件json.load()
: 從文件讀取并解碼JSON數據
二、基本使用方法
1. 序列化(Python對象 → JSON字符串)
import jsondata = {"name": "張三","age": 30,"married": True,"children": ["小明", "小紅"],"pets": None
}json_str = json.dumps(data, ensure_ascii=False, indent=4)
print(json_str)
輸出:
{"name": "張三","age": 30,"married": true,"children": ["小明", "小紅"],"pets": null
}
參數說明:
ensure_ascii=False
: 允許非ASCII字符(如中文)直接輸出indent=4
: 美化輸出,使用4個空格縮進
2. 反序列化(JSON字符串 → Python對象)
json_data = '{"name": "李四", "age": 25, "city": "北京"}'
python_obj = json.loads(json_data)print(python_obj["name"]) # 輸出: 李四
print(type(python_obj)) # 輸出: <class 'dict'>
3. 文件讀寫操作
寫入JSON文件:
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:loaded_data = json.load(f)
三、高級用法
1. 處理復雜對象
默認情況下,json模塊只能處理基本數據類型。要序列化復雜對象,需要自定義編碼器:
class User:def __init__(self, name, age):self.name = nameself.age = agedef user_encoder(obj):if isinstance(obj, User):return {'name': obj.name, 'age': obj.age}raise TypeError(f'Object of type {obj.__class__.__name__} is not JSON serializable')user = User("王五", 28)
user_json = json.dumps(user, default=user_encoder)
2. 自定義解碼器
def user_decoder(dct):if 'name' in dct and 'age' in dct:return User(dct['name'], dct['age'])return dctuser_obj = json.loads(user_json, object_hook=user_decoder)
print(type(user_obj)) # 輸出: <class '__main__.User'>
3. 性能優化
對于大型JSON數據處理:
- 使用
json.JSONEncoder
和json.JSONDecoder
類提高性能 - 考慮使用
ujson
或orjson
等第三方庫(非標準庫)
四、實際應用場景
1. Web API開發
# Flask示例
from flask import Flask, jsonify, request
import jsonapp = Flask(__name__)@app.route('/api/data', methods=['POST'])
def receive_data():data = request.get_json() # 自動使用json模塊解析請求體# 處理數據...return jsonify({"status": "success"})
2. 配置文件管理
# 讀取配置
with open('config.json') as f:config = json.load(f)# 修改并保存配置
config['timeout'] = 30
with open('config.json', 'w') as f:json.dump(config, f, indent=2)
3. 數據交換與存儲
# 將Pandas DataFrame轉為JSON
import pandas as pd
df = pd.DataFrame({'A': [1, 2], 'B': ['x', 'y']})
json_str = df.to_json(orient='records')# 從JSON恢復DataFrame
new_df = pd.read_json(json_str)
五、常見問題與解決方案
-
中文亂碼問題
- 確保使用
ensure_ascii=False
- 文件操作時指定編碼為
utf-8
- 確保使用
-
日期時間對象的處理
from datetime import datetimedef datetime_encoder(obj):if isinstance(obj, datetime):return obj.isoformat()raise TypeError("Type not serializable")data = {'time': datetime.now()} json.dumps(data, default=datetime_encoder)
-
循環引用檢測
- 默認情況下json不處理循環引用
- 需要自行解決循環引用問題或使用第三方庫
六、最佳實踐
-
始終處理異常:
try:data = json.loads(json_str) except json.JSONDecodeError as e:print(f"Invalid JSON: {e}")
-
對于敏感數據,考慮使用
json.dumps()
的separators
參數壓縮JSON大小:json.dumps(data, separators=(',', ':'))
-
大型文件處理時,考慮使用
ijson
庫進行流式解析
七、總結
Python的json模塊是處理JSON數據的利器,掌握它可以:
- 輕松實現前后端數據交互
- 高效管理配置文件
- 處理各種數據交換場景