5

我想创建一个类,它有一个枚举作为属性。这个枚举应该有一个字符串表示,当转储使用 enum 属性作为 JSON 字符串的类的实例时,它显示为人类可读的值。在下面的最小工作示例中,我以三种不同的方式创建了三个枚举。

反序列化后,每个属性都向我们表明它来自一个枚举,但具有字符串表示的枚举除外。它只是一个字符串。

如果不可能实现这样的结构,我想知道为什么。

要求

如果你想测试它,你必须安装jsonsattrs使用

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)

orderorder_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蔬菜显示为字符串而不是枚举。

4

0 回答 0