如何让 json.dumps 序列化时对键进行自定义排序
发布时间 - 2026-01-27 00:00:00 点击率:次json.dumps 的 sort_keys 参数仅支持默认Unicode字典序,不支持自定义排序;需通过预处理字典或继承JSONEncoder实现灵活排序,但后者对嵌套字典无效。
json.dumps 的 sort_keys 参数只能启用默认字典序
默认情况下,json.dumps 会把字典键按 Unicode 码点升序排列(即 sort_keys=True),但不支持传入自定义比较函数或 key 函数。这是 Python 标准库的限制 —— json 模块底层用的是 sorted(obj.keys()),没有暴露 key= 参数。
用 sorted() 预处理字典再传给 json.dumps
最直接、兼容性最好的方式是手动对字典键排序,构造一个新字典(保持插入顺序),再交给 json.dumps。Python 3.7+ 中字典保持插入顺序,所以这个方法可靠。
常见场景包括:按业务优先级排键(如把 "id" 放最前)、按长度排序、忽略大小写、或按白名单顺序固定字段位置。
- 按字母逆序:
{k: v for k, v in sorted(d.items(), key=lambda x: x[0], reverse=True)} - 按白名单顺序(缺失键放最后):
order = ["id", "name", "email"]; sorted_items = sorted(d.items(), key=lambda kv: (order.index(kv[0]) if kv[0] in order else len(order), kv[0])) - 忽略大小写排序:
sorted(d.items(), key=lambda x: x[0].lower())
用 json.JSONEncoder 子类实现更灵活的控制
如果需要在多处复用同一套排序逻辑,或者想影响嵌套字典的键序,可以继承 json.JSONEncoder 并重写 encode() 或利用 default() 预处理。但注意:JSONEncoder 不直接接收原始字典对象,而是逐层调用,所以稳妥做法是在 encode() 入口做一次预处理。
示例(仅对顶层 dict 排序):
class SortedKeysEncoder(json.JSONEncoder):
def encode(self, obj):
if isinstance(obj, dict):
obj = {k: obj[k] for k in sorted(obj.keys(), key=str.lower)}
return super().encode(obj)
调用:json.dumps(data, cls=SortedKeysEncoder)。注意:此方式对嵌套 dict 无效,需递归处理 —— 若真有深层需求,建议改用预处理函数而非 encoder。
容易被忽略的坑:排序后丢失原始类型或触发不可预期行为
手动排序时,若字典键本身不是字符串(比如 int、tuple),sorted() 可能抛 TypeError;而 json.dumps 本身只接受字符串键,所以实际中几乎不会遇到非 str 键 —— 但如果你在排序逻辑里用了 .lower() 或其他字符串方法,务必先确保 k 是 str 类型。
另一个细节:某些序列化工具(如 orjson、ujson)不支持 cls 参数,也不认 sort_keys 的扩展,此时只能走预处理路线。
真正复杂的排序逻辑(比如依赖外部配置、动态

json.dumps 调用链里,单独写个 sort_dict_keys(data, key_func) 函数,语义清晰也方便单元测试。
# python
# js
# json
# 工具
# ai
# 排列
# 标准库
# if
# for
# 子类
# 字符串
# 递归
# int
# Lambda
# 继承
# len
# 对象
# default
# 自定义
# 不支持
# 的是
# 这是
# 升序
# 是在
# 最好的
# 你在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
javascript中对象的定义、使用以及对象和原型链操作小结
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
QQ浏览器网页版登录入口 个人中心在线进入
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
利用vue写todolist单页应用
如何用IIS7快速搭建并优化网站站点?
如何用VPS主机快速搭建个人网站?
怎么用AI帮你为初创公司进行市场定位分析?
Laravel如何处理文件下载请求?(Response示例)
详解Oracle修改字段类型方法总结
zabbix利用python脚本发送报警邮件的方法
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
详解jQuery中基本的动画方法
如何自定义建站之星网站的导航菜单样式?
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
如何挑选高效建站主机与优质域名?
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
Laravel怎么实现验证码(Captcha)功能
如何为不同团队 ID 动态生成多个“认领值班”按钮
Python制作简易注册登录系统
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
Android仿QQ列表左滑删除操作
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
Java类加载基本过程详细介绍
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
如何在服务器上配置二级域名建站?
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
网站图片在线制作软件,怎么在图片上做链接?
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
如何用景安虚拟主机手机版绑定域名建站?
Java垃圾回收器的方法和原理总结
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
油猴 教程,油猴搜脚本为什么会网页无法显示?
Laravel模型事件有哪些_Laravel Model Event生命周期详解
iOS正则表达式验证手机号、邮箱、身份证号等
如何用免费手机建站系统零基础打造专业网站?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
如何快速建站并高效导出源代码?

