【问题标题】:simplejson.dumps(dict) throws "not JSON serializable"simplejson.dumps(dict) 抛出“不可序列化的 JSON”
【发布时间】:2012-02-16 01:24:06
【问题描述】:

我有一个 Python 字典,其中键是字符串,值是 MyObject 对象的列表。 如果我执行

simplejson.dumps(dict)

它抛出“MyObject not JSON serializable”。

如何避免此异常,如何使 MyObject 可序列化?

【问题讨论】:

  • @Johnsyweb 我看到了链接的解决方案,但它有点帮助。对我来说它不起作用(在 BigTable 中执行查询时会引发异常)。

标签: python json dictionary serializable simplejson


【解决方案1】:

正确答案

为了使您的MyObject 可序列化,您需要实现一个可以在dumps 上引用的方法。例如:

class MyObject:
    #    ...
    #    MyObject has 3 properties: name (a string), number (an int), and parent (a MyObject)
    @staticmethod
    def serialize(obj):
        return {
            "name":   obj.name,
            "number": obj.number,
            "parent": obj.parent
        }

    #    ...

simplejson.dumps(myObjInstance, default=MyObject.serialize)

很酷的是dumps 将像所有其他 JSON 可序列化对象一样递归调用序列化方法。也就是说,obj.parent 也将被序列化,无需您采取任何进一步的行动。

高尔夫版

如果您只想将实例变量名称 1-1 映射到它们各自的值,则可以使用一些内置的 Python 魔法。每当您想序列化更复杂的对象时(同样,仅使用 1-1 变量值映射),只需调用此行:

simplejson.dumps(anyObj, default=lambda obj: obj.__dict__)

对于MyObject 的给定实例,它的行为与上述serialize 方法相同。

【讨论】:

  • 考虑 operator.attrgetter('__dict__') 而不是使用 lambda。
  • @SingleNegationElimination 你能指出为什么我们应该更喜欢它而不是 lambda 吗?
  • @Stew: operator.attrgetter() 是用 C 实现的; lambda 版本需要创建新的调用帧,执行 python 字节码,并完成大量工作。当没有简洁的内置方法时,lambda 很好,但是当有像 operator 模块的成员一样简洁和准确的东西时,这些会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2015-04-10
  • 2016-08-21
  • 2011-04-06
相关资源
最近更新 更多