Rasgele bir enum.Enum
üyeyi JSON'a kodlamak ve ardından aynı enum üyesi olarak (yalnızca enum üyesinin value
özniteliği yerine) kodunu çözmek istiyorsanız, bunu özel bir JSONEncoder
sınıf ve object_hook
bağımsız değişken olarak iletilecek bir kod çözme işlevi yazarak yapabilirsiniz json.load()
veya 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
as_enum
Fonksiyon kullanılarak kodlanmış olan JSON dayanır EnumEncoder
buna aynı şekilde davranır, ya da bir şey.
Üyelerine kısıtlama, PUBLIC_ENUMS
kötü amaçla oluşturulmuş bir metnin, örneğin, özel bilgileri (örneğin, uygulama tarafından kullanılan gizli bir anahtar) ilgisiz bir veritabanı alanına kaydedilmesi için kandırarak arama kodunu kullanmaktan kaçınmak için gereklidir. (bkz. http://chat.stackoverflow.com/transcript/message/35999686#35999686 ).
Örnek kullanım:
>>> 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'}