如果我写
import json
class Color():
FUSCHIA = 0x00
TURQUOISE = 0x01
EMERALD = 0x02
def my_default_serializer(o):
return o.__dict__
def get_colors():
return json.dumps(
{
'dark_bg': True,
'colors_batch': [Color.TURQUOISE,
Color.EMERALD]
},
default=my_default_serializer
)
print(get_colors())然后,不出所料,我得到了:
{"dark_bg": true, "colors_batch": [1, 2]}现在假设我通过引入enum.Enum来更新这段代码。其中,这很方便,因为Enum将解析字符串(例如,从文件中读取),因此我将上面的代码替换为:
import json
from enum import Enum
class Color(Enum):
FUSCHIA = 0x00
TURQUOISE = 0x01
EMERALD = 0x02
def my_default_serializer(o):
return o.__dict__
def get_colors():
return json.dumps(
{
'dark_bg': True,
'colors_batch': [Color['TURQUOISE'],
Color['EMERALD']]
},
default=my_default_serializer
)
print(get_colors())这将引入错误:
AttributeError: 'mappingproxy' object has no attribute '__dict__'(如果我没有指定默认的序列化程序,我会得到TypeError: Object of type 'Color' is not JSON serializable )。
我应该如何JSON序列化Enum-children?
发布于 2021-08-18 17:40:49
如下所示--似乎是可行的。其思想是覆盖JSONEncoder的default方法,检查传入的参数是否是Color的实例并处理它。
import json
from enum import Enum
class Color(Enum):
FUSCHIA = 0x00
TURQUOISE = 0x01
EMERALD = 0x02
class EnumEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Enum):
return {"__enum__": str(obj)}
return json.JSONEncoder.default(self, obj)
def get_colors():
return json.dumps(
{
'dark_bg': True,
'colors_batch': [Color['TURQUOISE'],
Color['EMERALD']]
}, cls=EnumEncoder
)
print(get_colors())https://stackoverflow.com/questions/68836343
复制相似问题