
Python中操作JSON
1. 导入模块
import json
2. Python与JSON数据类型对应
3. 序列化与反序列化
序列化(Python → JSON):
json.dumps()
反序列化(JSON → Python):
json.loads()
示例:
# 序列化:Python对象 → JSON字符串
data = {"name": "张三", "age": 30, "hobbies": ["读书", "跑步"]}
json_str = json.dumps(data, ensure_ascii=False) # 处理中文
print(json_str) # {"name": "张三", "age": 30, "hobbies": ["读书", "跑步"]}
# 反序列化:JSON字符串 → Python对象
python_obj = json.loads(json_str)
print(python_obj["name"]) # 张三
4. 文件读写JSON
写入JSON文件:
data = {"name": "李四", "city": "北京"}
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)
print(loaded_data["city"]) # 北京
5. 处理复杂数据类型
自定义对象序列化:
class User:
def __init__(self, name, age):
self.name = name
self.age = age
# 自定义序列化函数
def user_to_dict(user):
return {"name": user.name, "age": user.age}
user = User("王五", 25)
json_str = json.dumps(user, default=user_to_dict, ensure_ascii=False)
print(json_str) # {"name": "王五", "age": 25}
反序列化自定义对象:
def dict_to_user(d):
return User(d["name"], d["age"])
data = json.loads(json_str, object_hook=dict_to_user)
print(data.name) # 王五
6. 格式化与参数
indent
: 缩进美化sort_keys
: 按键排序ensure_ascii
: 禁止ASCII转义(支持中文)skipkeys
: 跳过非字典键
示例:
复制
data = {"b": 2, "a": 1, "c": "你好"}
json_str = json.dumps(data, indent=2, sort_keys=True, ensure_ascii=False)
print(json_str)
# {
# "a": 1,
# "b": 2,
# "c": "你好"
# }
7. 处理日期时间
JSON不支持datetime
类型,需手动转换:
from datetime import datetime
def datetime_serializer(o):
if isinstance(o, datetime):
return o.isoformat()
data = {"time": datetime.now()}
json_str = json.dumps(data, default=datetime_serializer)
print(json_str) # {"time": "2023-10-10T12:34:56.789012"}
反序列化时同理,需要使用object_hook
还原日期对象。
8. 错误处理
处理无效JSON数据:
invalid_json = "{'name': 'test'}" # 注意JSON要求双引号
try:
data = json.loads(invalid_json)
except json.JSONDecodeError as e:
print(f"解析错误:{e}")
9. 高级应用
批量处理大文件:使用
ijson
库流式解析。安全性:避免解析不可信来源的JSON(防范注入攻击)。
通过上述方法,你可以在Python中灵活处理JSON数据,适用于API交互、配置文件读写等场景。