我想创建一个类,它有一个枚举作为属性。这个枚举应该有一个字符串表示,当转储使用 enum 属性作为 JSON 字符串的类的实例时,它显示为人类可读的值。在下面的最小工作示例中,我以三种不同的方式创建了三个枚举。
反序列化后,每个属性都向我们表明它来自一个枚举,但具有字符串表示的枚举除外。它只是一个字符串。
如果不可能实现这样的结构,我想知道为什么。
要求
如果你想测试它,你必须安装jsons
并attrs
使用
pip install attrs jsons
最小的工作示例
在这里,您会看到一个最小的工作示例。
import jsons
import attr
from enum import Enum
# ----------------------------------------------------
# create enumeration with the help of a dictionary
fruits = {
"PINEAPPLE": "PINEAPPLE",
"APPLE": "APPLE",
"ORANGE": "ORANGE",
"BANANA": "BANANA",
}
Fruit = Enum("FRUITS", fruits)
# ----------------------------------------------------
# create a classical enumeration
class Nut(Enum):
PEANUT = 1
HAZELNUT = 2
CASHEW = 3
WALNUT = 4
# ----------------------------------------------------
# create enumeration with a string representation
class Vegetable(str, Enum):
BROCCOLI = "BROCCOLI"
CUCUMBER = "CUCUMBER"
POTATO = "POTATO"
ONION = "ONION"
# ----------------------------------------------------
# create a class which uses the enumerations
@attr.s(auto_attribs=True, kw_only=True)
class Order(jsons.JsonSerializable):
fruit: Fruit
nut: Nut
vegetable: Vegetable
# ----------------------------------------------------
# initialize an order object, serialize and deserialize it
order = Order(fruit=Fruit.APPLE, nut=Nut.PEANUT, vegetable=Vegetable.CUCUMBER)
json_string: str = Order.dumps(order)
order_deserialised: Order = Order.loads(json_string)
order
和order_deserialised
变量的结构:
order: Order(fruit=<FRUITS.APPLE: 'APPLE'>, nut=<Nut.PEANUT: 1>, vegetable=<Vegetable.CUCUMBER: 'CUCUMBER'>)
order_deserialised: Order(fruit=<FRUITS.APPLE: 'APPLE'>, nut=<Nut.PEANUT: 1>, vegetable='CUCUMBER')
如您所见,order_deserialised
蔬菜显示为字符串而不是枚举。