![](/img/trans.png)
[英]How to get json of model pydantic in validator function
[英]How to resolve pydantic model is not JSON serializable
我有以下 pydantic 模型。
class SubModel(BaseModel):
columns: Mapping
key: List[str]
required: Optional[List[str]]
class Config:
anystr_strip_whitespace: True
extra: Extra.allow
allow_population_by_field_name: True
class MyModel(BaseModel):
name: str
config1: Optional[SubModel]
config2: Optional[Mapping]
class Config:
anystr_strip_whitespace: True
extra: Extra.allow
allow_population_by_field_name: True
当我试图对此进行dumps
时,我得到model is not JSON serializable
from io import BytesIO
from orjson import dumps
bucket = s3.Bucket(bucket_name)
bucket.upload(BytesIO(dumps(data)), key, ExtraArgs={'ContentType': 'application/json'})
错误 -
TypeError: Type is not JSON serializable: MyModel
data
是一个普通的 python 字典,其中一项是MyModel
类型的项目。 尝试使用.json()
但获取dict has no attribute json
。
我被困在这里。 有人能帮我吗。
对FastAPI
响应有类似的问题,通过以下方式解决:
return JSONResponse(content=jsonable_encoder(item), status_code=200)
或者可以是这样的:
return jsonable_encoder(item)
其中jsonable_encoder
是:
from fastapi.encoders import jsonable_encoder
更多细节在这里: https ://fastapi.tiangolo.com/tutorial/encoder/
这里的问题是 pydantic 模型默认情况下不是 json 可序列化的,在您的情况下,您可以调用 data.dict() 来序列化模型的 dict 版本。
from io import BytesIO
from orjson import dumps
bucket = s3.Bucket(bucket_name)
bucket.upload(BytesIO(dumps(data.dict())), key, ExtraArgs={'ContentType': 'application/json'})
仅设置一个默认编码器(如果其他所有方法都失败,则使用该编码器)怎么样?
orjson.dumps(
MyModel(name="asd"),
default=lambda x: x.dict()
)
# Output: b'{"name":"asd","config1":null,"config2":null}'
或者更多嵌套:
orjson.dumps(
{"a_key": MyModel(name="asd")},
default=lambda x: x.dict()
)
# Output: b'{"a_key":{"name":"asd","config1":null,"config2":null}}'
如果您有 Pydantic 以外的其他类型,只需创建一个函数并分别处理您拥有的所有类型。
它也适用于标准库中的json库(对于那些不使用 orjson 的库)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.