如何在FastAPI中自定义JSON编码器_处理Python中的UUID与日期格式

千浩姑娘_9313

千浩姑娘_9313

2026-05-15

930人浏览

原创

Wjs Uploading Video
Wjs Uploading Video

将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。

下载
fastapi默认json编码器不支持uuid和datetime,需通过basemodel的json_encoders或jsonable_encoder的custom_encoder统一处理。推荐uuid转str、datetime用isoformat()并注意时区与精度。

如何在fastapi中自定义json编码器_处理python中的uuid与日期格式

FastAPI默认JSON编码器不支持UUID和datetime

FastAPI底层用的是json.dumps(),而Python标准库的json模块原生不识别uuid.UUID和datetime对象,直接返回TypeError: Object of type UUID is not JSON serializable或类似错误。这不是FastAPI的bug,而是Python JSON序列化的固有限制。

你不需要重写整个响应流程,也不必在每个路由里手动str()或.isoformat()——FastAPI提供了统一接管点。

用json_encoders在BaseModel中声明字段级编码规则

这是最常用、最安全的方式,适用于Pydantic v1(FastAPI 0.104.x及更早)或v2中仍使用BaseModel定义响应模型的场景。它只影响该模型的序列化行为,不影响全局或其他模型。

  • json_encoders是BaseModel.Config(v1)或model_config(v2)里的字典,键为类型,值为转换函数
  • 对UUID,推荐直接转str;对datetime,建议用.isoformat()而非strftime,避免时区丢失
  • 注意:v2中需写成model_config = {"json_encoders": {...}},且json_encoders仅对model_dump(mode="json")生效(FastAPI自动调用)
from pydantic import BaseModel
from uuid import UUID
from datetime import datetime
<p>class Item(BaseModel):
id: UUID
created_at: datetime</p><pre class="brush:python;toolbar:false;"># Pydantic v2 写法
model_config = {
    "json_encoders": {
        UUID: str,
        datetime: lambda dt: dt.isoformat(),
    }
}

全局替换jsonable_encoder的custom_encoder参数

当你无法修改模型定义(比如用第三方库的BaseModel子类),或需要统一处理所有响应中的日期/UUID,可以用FastAPI内置的jsonable_encoder增强逻辑。它在JSONResponse、Response和依赖注入的BackgroundTasks等场景下都会被调用。

  • 在路由函数中显式调用jsonable_encoder(..., custom_encoder={...})是最可控的方式
  • 若想全局生效,可封装一个自定义JSONResponse子类,在render()里预置custom_encoder
  • 不要覆盖fastapi.encoders.jsonable_encoder本身——它被多处内部调用,改了可能破坏OpenAPI文档生成
from fastapi import FastAPI
from fastapi.responses import JSONResponse
from fastapi.encoders import jsonable_encoder
from uuid import UUID
from datetime import datetime
<p>app = FastAPI()</p><p>@app.get("/item")
def get_item():
data = {"id": UUID("a1b2c3d4-5678-90ab-cdef-1234567890ab"), "created_at": datetime.now()}
encoded = jsonable_encoder(
data,
custom_encoder={
UUID: str,
datetime: lambda dt: dt.replace(microsecond=0).isoformat() + "Z",
}
)
return JSONResponse(content=encoded)
</p>

注意时区与精度陷阱

很多人忽略datetime序列化后是否保留时区信息,以及微秒精度是否必要。FastAPI默认不处理时区,.isoformat()对naive datetime不带Z或+00:00,前端解析容易出错。

  • 后端存datetime建议统一用datetime.timezone.utc,输出时强制.astimezone(timezone.utc)
  • UUID转str没问题,但别用repr()或hex——前者带UUID('...')前缀,后者丢掉分隔符
  • 如果API要兼容旧系统,日期格式必须严格匹配(如"2024-01-01T12:00:00+00:00"),就别依赖lambda dt: dt.isoformat(),改用dt.strftime("%Y-%m-%dT%H:%M:%S%z")并手动补冒号

真正麻烦的不是怎么转,而是转完之后前后端对“时间”和“唯一标识”的语义理解是否一致。这点在跨团队协作时最容易被跳过。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1771

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4564

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1729

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

26917

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3247

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3267

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1203

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2543

5

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习