当前位置: 首页 > 面试题库 >

将Enum成员序列化为JSON

陶炫明
2023-03-14
问题内容

如何将Python Enum成员序列化为JSON,以便可以将生成的JSON反序列化为Python对象?

例如,此代码:

from enum import Enum    
import json

class Status(Enum):
    success = 0

json.dumps(Status.success)

导致错误:

TypeError: <Status.success: 0> is not JSON serializable

我该如何避免呢?


问题答案:

如果您想将任意enum.Enum成员编码为JSON,然后将其解码为相同的枚举成员(而不是简单的枚举成员的value属性),则可以编写一个自定义JSONEncoder类,并使用一个解码函数作为object_hook参数传递给json.load()or来实现。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函数依赖于已使用EnumEncoder或类似行为进行编码的JSON 。

对成员的限制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'}


 类似资料:
  • 我正在使用Jackson 2.1.4将POJO序列化为JSON,但我想忽略序列化的特定字段。我使用了瞬态,但它仍然在序列化该元素。 我正在序列化如下: 请不要建议,因为我不想将我的模型与杰克逊特定的注释联系起来。是否可以仅使用瞬态完成?对象映射器上是否有任何用于可见性设置的 API?

  • 我有以下JSON示例: 我想使用GSON来反序列化这个JSON字符串,并只获取“famousId”成员的值。 我已经看过了其他答案,似乎我绝对需要为此创建类。 有没有可能不映射POJO,使用JsonParser,JsonElement,JsonArray等反序列化?我已经尝试了几种排列,但没有成功。 我也尝试过以下代码,但也没有按预期工作: 不幸的是,这也不起作用,所以我想一个两部分的问题。。。可

  • 问题内容: 我正在客户端和Django服务器之间发送信息,并且我想对此使用JSON。我正在发送简单的信息-字符串列表。我尝试使用,但是当我这样做时, 看来这只能用于Django对象。如何序列化简单的Python对象? 问题答案: 你可以使用纯Python执行此操作:

  • 问题内容: 我有一些要映射到我的对象的JSON : 我的对象看起来像: 这是我的代码: 我不断收到此错误: 我在网上找到的所有示例都只是将JSON反序列化为带有少量或成员变量的简单POJO 。如何正确地将JSON映射到我的字段并使其行为正确? 我以为一旦工作成功就会返回,而会返回另一个(或)。我对使用Jackson还是很陌生,所以这甚至可能都不是我想要做的正确方法。任何帮助,将不胜感激! 问题答案

  • 如果类B扩展了类A,则类B实现可序列化,而类A有一个不可序列化的公共非静态初始化变量。。。尝试使用FileOutputStream的writeObject()方法写入类“B”对象时,将序列化从a继承的不可序列化成员,以便将其与类B的其余变量一起写入文件,还是将引发NotSerializableException?我试过了,效果不错,但我不知道为什么。。。所以我不确定它是否总是有效,或者我错过了什么

  • 问题内容: 我正在使用Newtonsoft JSON序列化程序,它适用于大多数对象。 不幸的是,当我尝试序列化一个大对象时,我得到了一个,其中一个成员抛出。 无论如何,有没有要忽略有问题的成员并序列化对象的其余部分? 我在想吗? 这是我想要做的简化版本: 这是堆栈跟踪: 如果有人知道可以执行此操作,我很乐意使用其他JSON序列化程序。 问题答案: 如果您不控制源代码,则可以在序列化过程中使用自定义