建模“有”关系

2024-05-23 13:46:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图对描述汽车的JSON进行建模:

{
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

为了对“has a”关系建模,我应该在Car中创建自己的to_json函数吗


Tags: selfjson关系initdef建模car汽车
2条回答

对您的方法进行修改,以检查子对象是否具有dicts,在这种情况下以及其他简单情况下都可以使用。例如:

def to_dict(obj):
    """Convert objects with a '__dict__' method into nested dicts."""

    return {
        key: to_dict(value) if hasattr(value, '__dict__') else value
        for key, value in obj.__dict__.items()
    }


print(json.dumps(to_dict(car)))

但在许多情况下,这一点会下降:

  • 如果在对象中使用__slots__
  • 如果要支持属性或列表

您可以扩展该方法来尝试并解释其中的每一个,但现在可能是时候咬紧牙关,要么使用序列化库(如其他地方所建议的),要么按照您的建议编写自己的特定于对象的to_dict()方法了

你应该考虑为你的汽车类设置一个编码器类,如下面的

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调用。在那里,我用规范字典取代了规范

相关问题 更多 >