如果您想将任意
enum.Enum成员编码为JSON,然后将其解码为相同的枚举成员(而不是简单的枚举成员的
value属性),则可以编写一个自定义
JSONEnprer类,并使用一个解码函数作为
object_hook参数传递给
json.load()or来实现。
json.loads():
PUBLIC_ENUMS = { 'Status': Status, # ...}class EnumEnprer(json.JSONEnprer): def default(self, obj): if type(obj) in PUBLIC_ENUMS.values(): return {"__enum__": str(obj)} return json.JSONEnprer.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函数依赖于已使用
EnumEnprer或类似行为进行编码的JSON 。
对成员的限制
PUBLIC_ENUMS是必要的,以避免使用恶意制作的文本来(例如)欺骗调用代码以将私有信息(例如,应用程序使用的密钥)保存到不相关的数据库字段中,然后从该字段中将其公开(请参阅http://chat.stackoverflow.com/transcript/message/35999686#35999686)。
用法示例:
>>> data = {... "action": "frobnicate",... "status": Status.success... }>>> text = json.dumps(data, cls=EnumEnprer)>>> text'{"status": {"__enum__": "Status.success"}, "action": "frobnicate"}'>>> json.loads(text, object_hook=as_enum){'status': <Status.success: 0>, 'action': 'frobnicate'}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)