python - 如何 JSON 序列化 Pydantic BaseModel 中的 ENum 类

标签 python json serialization pydantic

我有以下使用 Pydantic BaseModel 数据类的代码

from enum import Enum

import requests
from pydantic import BaseModel
from requests import Response


class PetType(Enum):
    DOG: str = 'dog'
    CAT: str = 'cat'


class Pet(BaseModel):
    name: str
    type: PetType


my_dog: Pet = Pet(name='Lucky', type=PetType.DOG)

# This works
resp: Response = requests.post('https://postman-echo.com/post', json=my_dog.json())
print(resp.json())

#This doesn't work
resp: Response = requests.post('https://postman-echo.com/post', json=my_dog.dict())
print(resp.json())

当我发送 json 等于模型的 dict() 时,我得到错误:

> TypeError:“PetType”类型的对象不是 JSON 可序列化的

如何克服这个错误并使 PetType 也可序列化?

附言 上面的例子很简短,但我遇到了一个用例,两种情况都发送

json=my_dog.json() 

json=my_dog.dict() 

不工作。这就是为什么我需要使用 dict() 解决发送问题

最佳答案

**<---- 加法----> **

Pydantic Model Config 中查找 Pydantic 的参数“use_enum_values”

使用_enum_values 是否使用枚举的 value 属性填充模型,而不是原始枚举。如果您想稍后序列化 model.dict(),这可能很有用(默认值:False)

看起来将此值设置为 True 将与以下解决方案相同。


原来这是 ENum 的一种行为,这里讨论:https://github.com/samuelcolvin/pydantic/issues/2278

你应该定义枚举的方式是使用

class PetType(str, Enum):

而不是

class PetType(Enum):

对于整数,这个 Python 的 Enum 库提供了 IntEnum 类型: https://docs.python.org/3.10/library/enum.html#enum.IntEnum

基本上是

class IntEnum(int, Enum):
    pass

如果您查看上面的 Enum 文档,您会发现像 StrEnum 这样的类型不存在,但按照 PetType 的示例,您可以轻松定义它。

我在下面附上工作代码

from enum import Enum

import requests
from pydantic import BaseModel
from requests import Response


class PetType(str, Enum):
    DOG: str = 'dog'
    CAT: str = 'cat'


class Pet(BaseModel):
    name: str
    type: PetType


my_dog: Pet = Pet(name='Lucky', type=PetType.DOG)

# This works
resp: Response = requests.post('https://postman-echo.com/post', json=my_dog.json())
print(resp.json())

# Now this also works
resp: Response = requests.post('https://postman-echo.com/post', json=my_dog.dict())
print(resp.json())

关于python - 如何 JSON 序列化 Pydantic BaseModel 中的 ENum 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69541613/

相关文章:

c# - JSONResult 到字符串

javascript - QuerySet 不是 JSON 可序列化的 Django

python - 将150个CSV导入一个数据源

python - 为什么我需要在 tkinter 函数内部使用全局语句?

json - 如何从Json文件导入MongoDb

java - 为什么 Jackson 没有完成从流创建 json?

java - 如何在反序列化时重新附加单例 Spring bean

python - Openshift 是否支持 Selenium ?

python - 使用 SelectKBest 的问题 [scikit-learn]

c# - 使用 JsonConvert 将 C# 中的 JSON 转换为对象