Pydantic v2移除json_loads/json_dumps配置,求替代方案指引
Pydantic v2 中 json_loads/json_dumps 的替代方案
1. 单模型调用时自定义处理
直接在model_dump_json()(序列化)或model_validate_json()(反序列化)方法中传入对应参数,替代原配置项:
- 自定义序列化(替代原
json_dumps):from pydantic import BaseModel import json from datetime import datetime def custom_encoder(obj): if isinstance(obj, datetime): return obj.isoformat() + 'Z' raise TypeError(f"Object of type {obj.__class__.__name__} is not JSON serializable") class Item(BaseModel): created_at: datetime item = Item(created_at=datetime.now()) json_str = item.model_dump_json(encoder=custom_encoder) - 自定义反序列化(替代原
json_loads):def custom_decoder(dct): if 'created_at' in dct: dct['created_at'] = datetime.fromisoformat(dct['created_at'].rstrip('Z')) return dct item = Item.model_validate_json(json_str, decoder=custom_decoder)
2. 全局统一配置
如果需要让所有模型共享自定义逻辑,可以封装一个基类,把参数固化到方法中:
from pydantic import BaseModel class CustomBaseModel(BaseModel): @classmethod def validate_json(cls, json_str: str): return cls.model_validate_json(json_str, decoder=custom_decoder) def dump_json(self): return self.model_dump_json(encoder=custom_encoder) # 后续业务模型直接继承该基类 class Item(CustomBaseModel): created_at: datetime
3. 单个字段级别的自定义处理
针对特定字段的JSON序列化需求,结合Json类型字段的serialize和deserialize参数实现:
from pydantic import BaseModel, Json from typing import Any def custom_json_serialize(value: Any) -> str: return json.dumps(value, default=custom_encoder) def custom_json_deserialize(value: str) -> Any: return json.loads(value, object_hook=custom_decoder) class Item(BaseModel): data: Json[Any] = Json(..., serialize=custom_json_serialize, deserialize=custom_json_deserialize)
内容的提问来源于stack exchange,提问作者user2465039
相关产品推荐
相关产品推荐

