簡體   English   中英

pydantic 轉換為 jsonable dict(不是完整的 json 字符串)

[英]pydantic convert to jsonable dict (not full json string)

我想使用pydantic來處理 api 和數據存儲之間的數據(雙向),因為它很好地支持了我關心的幾種類型,它們本身不是 json 可序列化的。 它比當前方法具有更好的讀取/驗證支持,但我還需要創建 json-serializable dict對象來寫出。

from uuid import UUID, uuid4
from pydantic import BaseModel

class Model(BaseModel):
    the_id: UUID

instance = Model(the_id=uuid4())
print("1: %s" % instance.dict()
print("2: %s" % instance.json()

印刷

{'the_id': UUID('4108356a-556e-484b-9447-07b56a664763')}
>>> inst.json()
'{"the_id": "4108356a-556e-484b-9447-07b56a664763"}'

我喜歡以下內容:

{"the_id": "4108356a-556e-484b-9447-07b56a664763"} # eg "json-compatible" dict

看來,雖然 pydantic 具有所有映射,但我在pydantic/main.py中找不到標准json ~遞歸編碼器( json.dumps(... default=pydantic_encoder) )之外的任何序列化用法。 但我更願意為 validate raw->obj (pydantic 擅長於此)和 obj->raw(dict) 保留一個庫,這樣我就不必管理多個序列化映射。 我想我可以實現類似於編碼器的json用法的東西,但這應該是一個常見的用例嗎?

其他方法,如dataclasses(builtin) + 庫,如dataclasses_jsonschemajson-ready dict提供了這種〜序列化,但同樣希望使用 pydantic 進行更強大的輸入驗證,同時保持對稱。

當前版本的pydantic不支持直接創建 jsonable dict 但是您可以使用以下技巧:

class Model(BaseModel):
    the_id: UUID = Field(default_factory=uuid4)

print(json.loads(Model().json()))
{'the_id': '4c94e7bc-78fe-48ea-8c3b-83c180437774'}

或者通過orjson更有效

orjson.loads(Model().json())

似乎這個功能已經被提出,並且(可能)受到 pydantic 的作者 samuel colvin 的青睞,如https://github.com/samuelcolvin/pydantic/issues/951#issuecomment-552463606

它建議將simplify參數添加到Model.dict()到 output jsonalbe 數據。

此代碼在生產 api 層中運行,並且已執行,因此我們無法使用建議的單行解決方法(只需執行完全序列化( .json() )+完全反序列化)。 我們實現了一個自定義的 function 來做到這一點,降低.dict()的結果並將類型轉換為 jsonable - 希望上述提議的功能將來會添加到 pydantic。

另一種選擇是使用fastapi中的jsonable_encoder方法(如果您已經在使用): https://fastapi.tiangolo.com/tutorial/encoder/

該代碼看起來非常獨立,因此如果許可證允許,您可以復制粘貼它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM