pydantic 转换为 jsonable 字典(不是完整的 json 字符串)

问题描述 投票:0回答:4

我想使用

pydantic
来处理 api 和数据存储之间的数据(双向),因为它可以很好地支持我关心的几种本身不能 json 序列化的类型。它比当前方法具有更好的读取/验证支持,但我还需要创建 json 可序列化
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 具有所有映射,但我在标准

json
〜递归编码器(
json.dumps( ... default=pydantic_encoder)
)之外找不到序列化的任何用法。但我更愿意保留一个库来验证 raw->obj (pydantic 很擅长这一点)以及 obj->raw(dict),这样我就不必管理多个序列化映射。我想我可以实现类似于编码器
pydantic/main.py
用法的东西,但这应该是一个常见的用例?
其他方法(例如 

json

+ 库(例如

dataclasses(builtin)
)提供此〜序列化到
dataclasses_jsonschema
,但同样,希望使用 pydantic 进行更强大的输入验证,同时保持对称。
    

python python-3.x jsonserializer pydantic
4个回答
31
投票

当前版本的

json-ready dict

不支持直接创建jsonable

pydantic
。但你可以使用以下技巧:

注意:这是一个次优解决方案

dict

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

print(json.loads(Model().json()))
或者通过 
orjson

更有效 {'the_id': '4c94e7bc-78fe-48ea-8c3b-83c180437774'}

皮丹提克 2

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

 方法接受 
model_dump() 参数。
mode

mode:`to_python` 应该运行的模式。

如果模式为“json”,则字典将仅包含 JSON 可序列化类型。

如果模式为“python”,则字典可能包含任何Python对象。

mode: Literal['json', 'python'] | str = 'python'


14
投票
https://github.com/samuelcolvin/pydantic/issues/951#issuecomment-552463606

建议向

class Model(BaseModel): the_id: UUID = Field(default_factory=uuid4) print(Model().model_dump(mode='json'))

添加

simplify
参数以输出 jsonalbe 数据。
此代码在生产 api 层中运行,并且经过了锻炼,因此我们无法使用建议的单行解决方法(只需执行完整序列化 (

Model.dict()

) + 完整反序列化)。我们实现了一个自定义函数来执行此操作,对

.json()
的结果进行降序并将类型转换为 jsonable - 希望上述建议的功能将来添加到 pydantic 中。
    


12
投票
.dict()

中的

jsonable_encoder
方法(如果您已经使用过):
https://fastapi.tiangolo.com/tutorial/encoder/
该代码看起来非常独立,因此如果许可证允许,您可以复制粘贴它。


6
投票
fastapi

参数的

.model_dump()
方法:
mode="json"

来自

print(instance.model_dump(mode="json"))

文档:

Pydantic 2 Plan
    
© www.soinside.com 2019 - 2024. All rights reserved.