Я бы посоветовал вам попробовать сериализовать свой класс Inventory , используя модуль json. Однако, похоже, вы захотите немного реорганизовать свои данные. Из того, что я могу сказать, вы хотите иметь инвентарь , который имеет коллекцию стран , которые содержат набор из продуктов , разделенных на категории .
Сначала давайте определим класс Product :
class Product(object):
def __init__(self, name, count):
self.product = name
self.count = count
Затем мы можем определить класс Country в качестве контейнера для установите Продукты , расположенные в словаре, используя категорию в качестве ключа.
class Country(object):
def __init__(self, name):
self.name = name
self.categories = dict()
def add_product_to_category(self, category, product):
if category not in self.categories:
self.categories[category] = []
self.categories[category].append(product)
Затем мы можем переопределить Инвентарь class как контейнер для набора Country объектов.
class Inventory(object):
def __init__(self, project_no):
self.project_no = project_no
self.countries = []
Далее, мы можем использовать простые методы для заполнения наших классов необходимыми данными.
inv = Inventory(1)
us_set = Country('USA')
us_set.add_product_to_category('Beverages', Product('Milk', 2))
us_set.add_product_to_category('Beverages', Product('Juice', 5))
us_set.add_product_to_category('Snacks', Product('Potato Chips', 2))
us_set.add_product_to_category('Oils', Product('Canola', 5))
us_set.add_product_to_category('Oils', Product('Olive', 8))
canada_set = Country('CAN')
canada_set.add_product_to_category('Beverages', Product('Milk', 7))
canada_set.add_product_to_category('Beverages', Product('Juice', 8))
canada_set.add_product_to_category('Snacks', Product('Potato Chips', 8))
canada_set.add_product_to_category('Oils', Product('Canola', 3))
canada_set.add_product_to_category('Oils', Product('Olive', 4))
inv.countries.append(us_set)
inv.countries.append(canada_set)
Наконец, (чтобы ответить на ваш вопрос, lul), чтобы сериализовать класс Inventory , мы должны определить кодировщик для использования:
class MyEncoder(json.JSONEncoder):
def default(self, o):
return o.__dict__
Теперь мы можем просто вызвать json .dumps (), чтобы получить строковый вывод нашего сериализованного инвентаря .
json.dumps(inv, indent=2, cls=MyEncoder)
Вывод не точно * 105 0 * что вы изложили, но я думаю, что этот метод будет хорошо работать для вас.
{
"project_no": 1,
"countries": [
{
"name": "USA",
"categories": {
"Beverages": [
{
"count": 2,
"product": "Milk"
},
{
"count": 5,
"product": "Juice"
}
],
"Oils": [
{
"count": 5,
"product": "Canola"
},
{
"count": 8,
"product": "Olive"
}
],
"Snacks": [
{
"count": 2,
"product": "Potato Chips"
}
]
}
},
{
"name": "CAN",
"categories": {
"Beverages": [
{
"count": 7,
"product": "Milk"
},
{
"count": 8,
"product": "Juice"
}
],
"Oils": [
{
"count": 3,
"product": "Canola"
},
{
"count": 4,
"product": "Olive"
}
],
"Snacks": [
{
"count": 8,
"product": "Potato Chips"
}
]
}
}
]
}