यदि आप enum.EnumJSON के एक मनमाने सदस्य को एनकोड करना चाहते हैं और फिर इसे उसी एनम सदस्य (केवल एनम सदस्य की valueविशेषता के बजाय) के रूप में डिकोड करते हैं , तो आप कस्टम JSONEncoderवर्ग लिखकर और डिकोडिंग फ़ंक्शन को object_hookतर्क के रूप में पारित करने के लिए ऐसा json.load()कर सकते हैं। 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फ़ंक्शन JSON पर निर्भर करता EnumEncoderहै जिसका उपयोग करके एन्कोड किया गया है , या ऐसा कुछ जो इसके लिए व्यावहारिक रूप से व्यवहार करता है।
सदस्यों के लिए प्रतिबंध PUBLIC_ENUMSएक दुर्भावनापूर्ण रूप से तैयार किए गए पाठ से बचने के लिए आवश्यक है, उदाहरण के लिए, एक असंबंधित डेटाबेस क्षेत्र में निजी जानकारी (जैसे आवेदन द्वारा उपयोग की जाने वाली एक गुप्त कुंजी) को बचाने में चाल कॉलिंग कोड, जहां से यह तब उजागर हो सकता है। (देखें http://chat.stackoverflow.com/transcript/message/35999686#35999686 )।
उदाहरण उपयोग:
>>> 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'}