আপনি যদি 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
প্রয়োজনীয়ভাবে দূষিতভাবে তৈরি করা পাঠ্য এড়ানো প্রয়োজন, উদাহরণস্বরূপ, ব্যক্তিগত তথ্য সংরক্ষণের ক্ষেত্রে কলিং কোডটি (উদাহরণস্বরূপ অ্যাপ্লিকেশন দ্বারা ব্যবহৃত একটি গোপনীয় চাবি) কোনও সম্পর্কযুক্ত ডেটাবেস ক্ষেত্রে ব্যবহার করা যেতে পারে, সেখান থেকে এটি প্রকাশ করা যেতে পারে from ( 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'}