我应该如何 JSON-序列化 Enum-children?
How should I JSON-serialize Enum-children?
如果我写
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?
见下文 - 似乎有效。这个想法是重写 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())
如果我写
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?
见下文 - 似乎有效。这个想法是重写 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())