Nếu bạn muốn mã hóa một thành viên enum.Enum
tùy ý thành JSON và sau đó giải mã nó thành thành viên enum tương tự (thay vì chỉ đơn giản là thuộc tính của thành viên enum value
thuộc tính), bạn có thể làm nên bằng cách viết một JSONEncoder
lớp tùy chỉnh, và một chức năng giải mã để vượt qua như là đối số object_hook
-json.load()
hoặc json.loads()
:
PUBLIC_ENUMS = {
'Status': Status,
# ...
}
class EnumEncoder(json.JSONEncoder):
def default(self, obj):
if type(obj) in PUBLIC_ENUMS.values():
return {"__enum__": str(obj)}
return json.JSONEncoder.default(self, obj)
def as_enum(d):
if "__enum__" in d:
name, member = d["__enum__"].split(".")
return getattr(PUBLIC_ENUMS[name], member)
else:
return d
Chức năng as_enum
dựa trên JSON đã được mã hóa sử dụng EnumEncoder
, hoặc một cái gì đó mà cư xử hệt với nó .
Hạn chế đối với thành viên PUBLIC_ENUMS
là cần thiết để tránh văn bản độc hại được sử dụng, ví dụ: mã gọi lừa để lưu thông tin cá nhân (ví dụ: khóa bí mật được ứng dụng sử dụng) vào trường cơ sở dữ liệu không liên quan sau đó nó có thể được tiếp xúc (xem http://chat.stackoverflow.com/transcript/message/35999686#35999686).
Ví dụ sử dụng:
>>> data = {
... "action": "frobnicate",
... "status": Status.success
... }
>>> text = json.dumps(data, cls=EnumEncoder)
>>> text
'{"status": {"__enum__": "Status.success"}, "action": "frobnicate"}'
>>> json.loads(text, object_hook=as_enum)
{'status': <Status.success: 0>, 'action': 'frobnicate'}
Nguồn
2014-06-30 04:06:46
@ZeroPiraeus: Chỉ cần tình cờ gặp vấn đề này. Tôi không biết là tôi đã trả lời rất nhiều! :) –