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

What is the difference between calling dict of a Pydantic model and passing it to the jsonable_encoder function?

提问人:Amin Ba 提问时间:4/19/2023 最后编辑:Daniil FajnbergAmin Ba 更新时间:4/19/2023 访问量:744

问:

我有这个 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 对象的方法和将其传递给 有什么区别?dictjsonable_encoder

python fastapi pydantic

评论

0赞 Chris 4/19/2023
您可能也会发现此答案对您有所帮助
1赞 Daniil Fajnberg 4/19/2023
旁注:老实说,不知道为什么你需要其中任何一个。您可以直接让 FastAPI 在后台完成转储和序列化过程。状态代码也可以在路由装饰器中设置。return Student(id="1", name="Alice")
0赞 Amin Ba 4/19/2023
@DaniilFajnberg 我想将状态代码更改为自定义代码

答:

1赞 nigh_anxiety 4/19/2023 #1

Python dict 对象允许 JSON 不允许的很多事情。主要是,任何可哈希对象都可以用作 dict 键,任何对象都可以用作 dict 值,不受限制。

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

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

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