food_data
是一个包含JSON数据的变量。使用这些数据,我想创建一个Food对象列表,比如
foods = []
for data_row in food_data:
foods.append(Food(data_row))
这就是我的美食课现在的样子:
class Food(dict):
""" by inheriting from dict, Food objects become automatically serializable for JSON formatting """
def __init__(self, data):
""" create a serialized food object with desired fields """
id = data["id"]
name = data["title"]
image = data["image"]
super().__init__(self, id=id, name=name, image=image)
下面是一些示例数据:
[
{
"id": 738290,
"title": "Pasta with Garlic, Scallions, Cauliflower & Breadcrumbs",
"image": "https://spoonacular.com/recipeImages/716429-312x231.jpg",
},
{
"id": 343245,
"title": "What to make for dinner tonight?? Bruschetta Style Pork & Pasta",
"image": "https://spoonacular.com/recipeImages/715538-312x231.jpg",
}
]
我可以为Food类编写一个方法来获取数据并返回其不同版本的列表吗
我会从而不是子类化dict
开始:有一种更好的方法可以使Food
的实例可序列化。
接下来,让Food.__init__
变哑:三个参数,用于设置三个属性。
然后,定义一个类方法,负责解析至少具有id
、title
和image
密钥的任意dict
,以获得Food.__init__
所期望的值。
最后,定义一个方法,将Food
的实例转换回dict
(尽管不一定与from_dict
使用的dict
相同;生成一个以您想要的方式序列化的方法(。
class Food:
def __init__(self, id, name, image):
self.id = id
self.name = name
self.image = image
@classmethod
def from_dict(cls, d):
return cls(id=d['id'], name=d['title'], image=d['image'])
def to_dict(self):
return dict(id=self.id, name=self.name, image=self.image)
foods = [Food.from_dict(d) for d in food_data]
要使实例可序列化,请定义一个使用to_dict
方法的客户编码器
class FoodEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Food):
return obj.to_dict()
return super().default(obj)
这个搭载在默认编码器上;如果立即对象是Food
,则default
返回可序列化的dict
。否则,它会推迟到其父级尝试序列化它
然后在对json.dumps
的调用中使用该类。
print(json.dumps(foods, cls=FoodEncoder))
我认为在我的情况下,我可能已经过度设计了我的代码。但我收到了很多回复,这些回复确实在其他方面帮助了我,所以我将在这里提供它们:
@Juanpa使用列表理解
foods = [Food[data] for data in food_data]
@Chepner-无关但有用json子类。JSONEncoder而不是dict用于可序列化
@Matthias在类中创建一个静态方法以返回对象列表
@staticmethod
def create_foods(food_data):
foods = []
for data_row in food_data:
foods.append(Food(data_row))