simplejson.dumps(dict)抛出"not JSON serializable"

Gio*_*ner 3 python json dictionary simplejson serializable

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

simplejson.dumps(dict)
Run Code Online (Sandbox Code Playgroud)

它抛出"MyObject not JSON serializable".

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

Pat*_*ini 7

正确答案

为了使您的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)
Run Code Online (Sandbox Code Playgroud)

很酷的是,它dumps会像其他所有JSON可序列化对象一样,以递归方式调用序列化方法.也就是说,obj.parent也会进行序列化,而不需要您采取任何进一步的操作.

高尔夫版本

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

simplejson.dumps(anyObj, default=lambda obj: obj.__dict__)
Run Code Online (Sandbox Code Playgroud)

对于给定的实例MyObject,它将表现与前述serialize方法相同.

  • 考虑`operator.attrgetter('__ dict __')`而不是使用lambda. (5认同)
  • @Stew:`operator.attrgetter()`在C中实现; `lambda`版本需要创建新的调用框架,执行python字节码,并完全做一堆工作.如果没有简洁的内置方法,那么`lambda`就可以了,但是当`operator`模块的成员可用时,有些内容简洁精确,那就更好了. (2认同)