讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 Pydantic 2 中统一将 set 字段序列化为有序列表

陌萱小哥_4505

陌萱小哥_4505

发布时间:2026-01-31 13:14:02

|

662人浏览过

|

来源于php中文网

原创

如何在 Pydantic 2 中统一将 set 字段序列化为有序列表

pydantic 2 默认将 `set` 序列化为无序列表,导致 json 输出不稳定;本文介绍通过 `@field_serializer` 实现字段级可控排序,并提供可复用的基类方案,避免重复定义,兼顾简洁性与可扩展性。

在 Pydantic 2 中,set 类型字段虽能自动转为 JSON 列表,但其元素顺序由 Python 内部哈希实现决定,不保证跨实例或跨运行的一致性——这会破坏缓存、签名、diff 比较等依赖确定性序列化的场景。虽然 Pydantic 1 支持全局 json_encoders 配置,但该机制已在 v2 中移除;而 model_serializer 虽通用,却需手动遍历字段、类型判断与委托序列化,违背“利用 Pydantic 类型系统”的初衷。

最推荐、最轻量且符合 Pydantic 2 设计哲学的解法是:使用 @field_serializer 配合类型提示和 when_used='json'。它精准作用于目标字段,在序列化流程的合适时机介入,无需侵入模型逻辑,也无需自定义类型:

from typing import Set, Any
from pydantic import BaseModel, field_serializer

class SortedSetModel(BaseModel):
    tags: Set[str]
    ids: Set[int]

    @field_serializer('tags', 'ids', when_used='json')
    def _serialize_sets(self, value: Any) -> list:
        # 支持泛型 set(str/int/...),自动排序(仅限可比较元素)
        if isinstance(value, set):
            return sorted(value)
        return list(value)  # fallback(如 None 或非 set)

调用 SortedSetModel(tags={'z', 'a', 'm'}, ids={42, 7, 100}).model_dump_json() 将稳定输出:

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
{"tags": ["a", "m", "z"], "ids": [7, 42, 100]}

✅ 优势明确:

  • ✅ 类型安全:value: Any + isinstance 保障运行时健壮性,IDE 仍可推导参数类型;
  • ✅ 复用友好:可抽象为基类,供所有需排序 set 的模型继承;
  • ✅ 子类兼容:子类新增的 Set[...] 字段只需额外传入字段名到装饰器即可;
  • ✅ 语义清晰:when_used='json' 确保仅影响 model_dump_json() 和 model.json(),不影响 model_dump()(Python dict)等其他序列化路径。

⚠️ 注意事项:

  • sorted() 要求集合内元素可比较且同构(如不能混用 str 和 int),否则抛 TypeError;生产环境建议搭配 try/except 或预校验;
  • 若需深度嵌套结构(如 Set[CustomModel])的确定性序列化,应为 CustomModel 实现 __lt__ 或自定义 field_serializer 处理其 model_dump_json() 输出;
  • 避免在 @field_serializer 中修改原字段值(如 self.tags = ...),它仅用于序列化转换,非数据验证或赋值钩子。

综上,@field_serializer 是 Pydantic 2 中平衡简洁性、可维护性与确定性的首选方案——它不试图“重写序列化引擎”,而是优雅地在框架预留的扩展点上施加最小干预,让 set 的 JSON 表现真正可靠。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2175

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3402

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1136

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3899

2025.09.10

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2175

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3402

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1136

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3899

2025.09.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn