Python 建模&x27;有一个';关系
我试图对描述汽车的JSON进行建模:Python 建模&x27;有一个';关系,python,Python,我试图对描述汽车的JSON进行建模: { colour : "green" specs : { brakes : "good brakes" } } 汽车与规格“有”关系。以下是我如何实现的: import json class Car : def __init__(self , colour, specs): self.colour = colour self.specs = specs class Spec
{
colour : "green"
specs : {
brakes : "good brakes"
}
}
汽车与规格“有”关系。以下是我如何实现的:
import json
class Car :
def __init__(self , colour, specs):
self.colour = colour
self.specs = specs
class Specs :
def __init__(self , brakes):
self.brakes = brakes
specs = Specs("good brakes")
car = Car("Green" , specs)
print(json.dumps(car.__dict__))
返回:
TypeError: Object of type Specs is not JSON serializable
< >为了建立“有A”关系,我应该在<代码> CAL/<代码>中创建我自己的TojJSON函数吗? < P>你应该考虑为你的汽车类有一个类似于的编码器类。
In [8]: import json
...:
...: class Car :
...: def __init__(self , colour, specs):
...: self.colour = colour
...: self.specs = specs
...:
...: class Specs :
...: def __init__(self , brakes):
...: self.brakes = brakes
...:
...:
...: specs = Specs("good brakes")
...: car = Car("Green" , specs)
...:
In [9]:
In [10]: from json import JSONEncoder
...:
In [11]: class CarEncoder(JSONEncoder):
...: def default(self, o):
...: op = o.__dict__
...: op['specs'] = o.specs.__dict__
...: return op
...:
...:
...:
In [12]: json.dumps(car, cls=CarEncoder)
Out[12]: '{"colour": "Green", "specs": {"brakes": "good brakes"}}'
In [13]:
CarEncoder的默认方法将由json.dumps调用。在这里,我已经用规格字典替换了规范, 你应该考虑为你的汽车类有一个编码器类,比如
In [8]: import json
...:
...: class Car :
...: def __init__(self , colour, specs):
...: self.colour = colour
...: self.specs = specs
...:
...: class Specs :
...: def __init__(self , brakes):
...: self.brakes = brakes
...:
...:
...: specs = Specs("good brakes")
...: car = Car("Green" , specs)
...:
In [9]:
In [10]: from json import JSONEncoder
...:
In [11]: class CarEncoder(JSONEncoder):
...: def default(self, o):
...: op = o.__dict__
...: op['specs'] = o.specs.__dict__
...: return op
...:
...:
...:
In [12]: json.dumps(car, cls=CarEncoder)
Out[12]: '{"colour": "Green", "specs": {"brakes": "good brakes"}}'
In [13]:
CarEncoder的默认方法将由json.dumps调用。在那里,我用规范字典替换了规范。对您的方法进行了修改,以检查子对象是否具有DICT,在这种情况下以及其他简单情况下都可以使用。例如:
def to_dict(obj):
“”“将具有'\uuuu dict\uuuu'方法的对象转换为嵌套dict。”“”
返回{
键:如果hasattr(值,'.'.'指定'.''else值,则指定(值)'.'其他值
对于键,对象中的值
}
打印(json.dumps(to_dict(car)))
但在许多情况下,这一点会下降:
- 如果在对象中使用
\uuuuuuuuuuuuuuuuuuuuuuuu
- 如果要支持属性或列表
您可以扩展该方法来尝试并解释其中的每一项,但现在可能是时候咬紧牙关,要么使用序列化库(如其他地方所建议的),要么将您自己的特定于对象的
编写到_dict()
如您所建议的方法。对您的方法进行修改,以检查子对象是否具有DICT,在这种情况下以及其他简单情况下都可以使用。例如:
def to_dict(obj):
“”“将具有'\uuuu dict\uuuu'方法的对象转换为嵌套dict。”“”
返回{
键:如果hasattr(值,'.'.'指定'.''else值,则指定(值)'.'其他值
对于键,对象中的值
}
打印(json.dumps(to_dict(car)))
但在许多情况下,这一点会下降:
- 如果在对象中使用
\uuuuuuuuuuuuuuuuuuuuuuuu
- 如果要支持属性或列表
您可以扩展该方法来尝试并解释其中的每一项,但现在可能是时候咬紧牙关,要么使用序列化库(如其他地方所建议的),要么将您自己的特定于对象的
编写到_dict()
如您所建议的方法。您的类设计确实模拟了IMO之间的关系。但这不是您遇到的问题。一般来说,如果不做一些额外的工作,通用Python对象就不能被JSON序列化。添加“to_json”函数没有帮助。标准文档中有一些简单案例的插图。你到底想得到什么帮助?你的课堂设计确实模拟了这种关系。但这不是你面临的问题。一般来说,如果不做一些额外的工作,通用Python对象就不能被JSON序列化。添加“to_json”函数没有帮助。标准文档中有一些简单案例的插图。你到底需要什么帮助?