यदि आप enum.Enum
JSON के एक मनमाने सदस्य को एनकोड करना चाहते हैं और फिर इसे उसी एनम सदस्य (केवल एनम सदस्य की 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'}