调用 Pydantic 模型的 dict 和将其传递给 jsonable_encoder 函数有什么区别?

3
我有一个 Pydantic 模型:
from pydantic import BaseModel

class Student(BaseModel):
    name: str
    id: str

我在FastAPI文档中看到,如果我们想要传递JSONResponse,我们可以这样做:

from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse


app = FastAPI()


@app.get("/")
def get_a_specific_student():
    s = Student(id="1", name="Alice")
    status_code = 200
    content = jsonable_encoder(s)
    return JSONResponse(status_code=status_code, content=content)

我们可以尝试这样做:

@app.get("/")
def get_a_specific_student():
    s = Student(id="1", name="Alice")
    status_code = 200
    content = s.dict()
    return JSONResponse(status_code=status_code, content=content)

调用 Pydantic 对象的 dict 方法和将其传递给 jsonable_encoder 有什么区别?


您可能会发现这个答案也很有帮助。 - Chris
1
顺带一提:说实话我不知道为什么你需要那两个。你可以直接返回Student(id="1", name="Alice"),让 FastAPI 在后台完成转储和序列化流程。状态码也可以在路由装饰器中设置。 - Daniil Fajnberg
@DaniilFajnberg 我想将状态码更改为自定义的内容。 - Amin Ba
1个回答

1

Python的dict对象允许很多JSON不允许的操作。主要是任何可哈希对象都可以用作字典键,任何对象都可以用作字典值,没有限制。

在JSON中,键必须是用双引号写成的字符串。
此外,JSON值仅限于以下类型:

  • 字符串
  • 数字
  • 对象(JavaScript对象,~= Python中的dict)
  • 数组
  • 布尔值
  • null(在Python中不存在,但None是一个相似的等价物)

Jsonable_encoder将确保对象是有效的JSON。例如,所有键将被转换为字符串,字典值中的Python对象将被替换为repr()值等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接