在Python中,有没有一种方法可以在使用_插槽的对象上使用json.dumps?
当我尝试在使用在Python中,有没有一种方法可以在使用_插槽的对象上使用json.dumps?,python,json,cpython,Python,Json,Cpython,当我尝试在使用\uuuu slots\uuuu的类的对象上使用json.dumps时,我得到“…json不可序列化”,或者可能是缺少\uuu dict\uuuu的属性错误。我怎样才能让它工作?似乎\uuuuuuuuuuuuuuuuuuuuuuuuuuu应该告诉解释器使用虚拟字典以实现兼容性 import json class Foo: __slots__ = ["bar"] def __init__(self): self.bar = 0 json.du
\uuuu slots\uuuu
的类的对象上使用json.dumps
时,我得到“…json不可序列化”,或者可能是缺少\uuu dict\uuuu
的属性错误。我怎样才能让它工作?似乎\uuuuuuuuuuuuuuuuuuuuuuuuuuu
应该告诉解释器使用虚拟字典以实现兼容性
import json
class Foo:
__slots__ = ["bar"]
def __init__(self):
self.bar = 0
json.dumps(Foo())
普通的json.dumps()
不支持自定义类,句号。不管他们是否在这里使用\uuuuu插槽
处理自定义类的一种流行方法是使用一个钩子来返回它们的\uuuu dict\uuuu
属性,而这显然在这里不起作用。您必须找到另一种方法来序列化这些对象
一种方法是让这些对象有一个专用的方法:
class Foo:
__slots__ = ["bar"]
def __init__(self):
self.bar = 0
def json_serialize(self):
return {'bar': self.bar}
并在您的default
hook中使用它:
json.dumps(Foo(), default=lambda o: o.json_serialize())
在没有的对象上也无法执行此操作。是什么让你认为它能在其他对象上工作?你可能会发现这个问题很有帮助。如果你想序列化一个对象,你需要使用pickle
。@MartijnPieters:看起来我实际上在做json.dumps(Foo(),default=lambda o:o.u dict\uuu)
,但我在写我的问题时忘记了这一点。@Vor:我需要一个序列化,它将在Python之外工作,并且是人类可读的<代码>pickle
在Python之外无法工作,如果类定义发生更改,Python内部甚至会出现问题。