JSON序列化自定义非可序列化对象的常规方法是子类化json.JSONEncoder,然后将自定义编码器传递给转储.
它通常看起来像这样:
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, foo):
return obj.to_json()
return json.JSONEncoder.default(self, obj)
print json.dumps(obj, cls = CustomEncoder)
Run Code Online (Sandbox Code Playgroud)
我正在尝试做的是使用默认编码器进行序列化.我环顾四周但找不到任何东西.我的想法是编码器会看到一些字段来确定json编码.类似的东西__str__.也许是一个__json__领域.在python中有这样的东西吗?
我想制作一个模块的类,我正在使用JSON序列化给使用该软件包的每个人,而不必担心实现他们自己的[普通]自定义编码器.
我有一个枚举类:
class Group(enum.Enum):
user = 0
manager = 1
admin = 2
Run Code Online (Sandbox Code Playgroud)
我有一个 pydantic 模型:
class User(BaseModel):
id: int
username: str
group: Group
Run Code Online (Sandbox Code Playgroud)
它生成序列化为 json 的内容如下:
{
"id": 5,
"username": "admin",
"group": 2
}
Run Code Online (Sandbox Code Playgroud)
但是,我想获取枚举字段的名称而不是其值,所以它应该是:
{
"id": 5,
"username": "admin",
"group": "admin"
}
Run Code Online (Sandbox Code Playgroud)
这有可能吗?如果是这样,怎么办?
我想创建一个类,它有一个枚举作为属性。此枚举应具有字符串表示形式,在将使用枚举属性的类实例转储为 JSON 字符串时,该表示形式显示为人类可读的值。在下面的最小工作示例中,我以三种不同的方式创建了三个枚举。
反序列化后,每个属性都向我们表明它来自枚举,但带有字符串表示形式的枚举除外。它只是一个字符串。
如果不可能实现这样的结构,我想知道为什么。
如果你想测试它,你必须安装jsons并attrs使用
pip install attrs jsons
Run Code Online (Sandbox Code Playgroud)
在这里您可以看到一个最小的工作示例。
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 …Run Code Online (Sandbox Code Playgroud) python enums serialization json-deserialization python-attrs