BaseModel在LLM时代在信息抽取场景中应用广泛。
在Pydantic中,继承自BaseModel的类可以通过内置方法轻松序列化为 JSON。
这里基于网络资料,示例将BaseModel子类实例转换为JSON字符串或字典,控制序列化细节。
1 JSON序列化
1.1 model_dump与json.dumps
model_dump()会返回一个字典,该字典可以继续使用标准json库的json.dumps再序列化。
示例代码如下
import json
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
user = User(name="Alice", age=30)
data_dict = user.model_dump() # {'name': 'Alice', 'age': 30}
json_str = json.dumps(data_dict) # '{"name": "Alice", "age": 30}'
1.2 model_dump_json
Pydantic v2 提供了直接返回JSON字符串的方法model_dump_json。
model_dump_json()默认返回紧凑 JSON,可通过indent参数美化。
如果模型包含复杂嵌套对象,序列化会自动递归处理。
以下是代码示例
json_str = user.model_dump_json() # '{"name":"Alice","age":30}'
model_dump_json返回的是紧凑型的json,可传递参数控制格式(如 indent)。
json_str = user.model_dump_json(indent=2)
1.3 Pydantic v1兼容写法
在 v1 中使用 ".dict()" 和 ".json()"
代码示例如下
data_dict = user.dict()
json_str = user.json() # 直接返回 JSON 字符串
对于 v1 用户,推荐升级到 v2 以获得更好的性能和安全性。
2. 自定义序列化行
Pydantic BaseModel的子类实例,还支持自定义序列化。
以下是一些经常使用的功能示例。
2.1 排除字段
使用exclude参数,设置需要排除的字段
user.model_dump_json(exclude={'age'}) # '{"name":"Alice"}'
2.2 使用别名
如果Pydantic BaseModel子类实例使用了别名,可以通过by_alias控制序列化时是否使用别名。
by_alias=True
示例代码如下
class User(BaseModel):
name: str = Field(alias="full_name")
user = User(full_name="Bob")
user.model_dump_json(by_alias=True) # '{"full_name":"Bob"}'
2.3 处理自定义类型
通过 json_encoders或实现__get_pydantic_core_schema__实现
示例代码如下
from datetime import datetime
class Event(BaseModel):
dt: datetime
class Config:
json_encoders = {datetime: lambda v: v.isoformat()}
2.4 序列化到文件
另外,还可以直接将BaseModel子类实例序列化到文件,代码更简洁,可读性更好。
示例如下
with open("user.json", "w") as f:
f.write(user.model_dump_json())
reference