Python 将类传递给json的最佳实践是什么?
问题:我有一个类的实例,我想将该类的主信息传递为json兼容的格式。我经常求助于创建一个to_dict方法,如下所示:Python 将类传递给json的最佳实践是什么?,python,json,class,Python,Json,Class,问题:我有一个类的实例,我想将该类的主信息传递为json兼容的格式。我经常求助于创建一个to_dict方法,如下所示: class A: def __init__(self, name, val): self.name = name self.val = val def to_dict(self): return { 'name': self.name, 'val': self.va
class A:
def __init__(self, name, val):
self.name = name
self.val = val
def to_dict(self):
return {
'name': self.name,
'val': self.val,
}
那我就可以了
a = A("a_name", 5)
a.to_dict()
它输出{'name':'a_name','val':5}
不过我觉得有点不雅。我考虑过修改\uuuu repr\uuuuu
,但我不认为这样更好,因为有时我想要一个不是dict的repr
所以我的问题是:在python中有更好的方法来实现这一点吗?有几种替代方法。例如,您可以使实例可移植,并让其产生键/值对。然后使用字典构造函数获取这些键/值对:
class A:
def __init__(self, name, val):
self.name = name
self.val = val
def __iter__(self):
yield "name", self.name
yield "val", self.val
a = A("Helen", 42)
d = dict(a)
您也可以使用
\uuuu dict\uuuu
根据上面的例子:
A类:
定义初始值(self、name、val):
self.name=名称
self.val=val
a=a(“海伦”,42岁)
打印(a.。uuuu dict_uuuu)
#>>{'name':'Helen','val':42}
上面写着:
要扩展此功能以识别其他对象,
子类并实现一个
方法和另一个方法,该方法为o
如果可能,否则它应该调用超类实现
(提出)
所以你可以做一些像
从json导入JSONEncoder
类MyJSONEncoder(JSONEncoder):
def默认值(自身,o):
如果存在(o,A):
返回f'{“name”:“{o.name}”,“value”:{o.value}”
返回super()。默认值(o)
# ...
打印(json.dumps(something,cls=MyJSONEncoder))
最后我稍微概括了一下,就是说
def default(self, o):
if hasattr(o, '__json__'):
return o.__json__()
return super().default(o)
然后在我想要为其指定json序列化格式的类中定义一个
\uuuu json\uuuu
方法。ato_dict
方法是完全合理的。我不确定实现\uuuu repr\uuuu
对您有什么好处,这与JSON无关。注意,通常,您的to dict
可以是返回变量(self)
尽管您必须小心,但如果您不了解dict是您实例的名称空间,并且这些更改将在您的实例中可见,则不要对其进行变异。这是一个出色的解决方案。它甚至可以递归地工作!我用一个类测试了它,其中一个属性是另一个类的实例。属性值正确打印为dict。