对基于Pydantic BaseModel的实例进行JSON序列化

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


相关推荐
冬奇Lab10 小时前
Workflow 系列(03):状态管理——持久化、幂等性与版本绑定
人工智能·工作流引擎
冬奇Lab10 小时前
每日一个开源项目(第146篇):openpilot - 开源自动驾驶辅助系统,曾在 Consumer Reports 评测中超过特斯拉 Autopilot
人工智能·开源·自动驾驶
吴佳浩11 小时前
AI 工程师知识地图:模型格式、框架、部署工具一次讲明白
人工智能·aigc·ai编程
IT_陈寒12 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
码农胖大海12 小时前
AI额度不够用的解决方案
人工智能
后端小肥肠12 小时前
小红书虚拟商品怎么做?我先用 Skill 跑通了壁纸品类
人工智能·aigc·agent
feiyu_gao12 小时前
从零搭建个人 AI 工作台:一个管理者的 3 个月实验
人工智能·aigc·团队管理
程序员cxuan13 小时前
一句话,让你用上 GPT-5.6
人工智能·后端·程序员
机器之心14 小时前
AI圈刚开始谈Loop Engineering,两位95后博士已经盯上了人类闭环数据
人工智能·openai