Сериализация списка экземпляров объектов, вложенных в экземпляр объекта python

0

Вопрос

Я создаю приложение, которое позволит вам либо войти в систему, либо создать ресторан. Как владелец ресторана, вы можете добавлять/удалять/редактировать холодильники. Моя конечная цель состоит в том, чтобы у меня был список ресторанов, которые я бы записал в файл JSON, и в любое время, когда я перезапускаю приложение, я могу получить эти данные и имитировать "быть владельцем ресторана" и редактировать холодильники для выбранного ресторана.

Я, по сути, хочу этого:

data = {
    restaurants: [
        {
            restaurant: {
            name: "Peppy",
            pw: "123",
            fridges: [
                {
                    fridge: {
                        owner: restaurant.name,
                        contents: []
                    }
                }
            ]
        }
        }
    ]
}

У меня есть следующие два класса(с указанием соответствующих методов):


class Restaurant:
    def __init__(self, owner, password):
        self.__password = password
        self.owner = owner
        self.__owned_fridges = [] # list of owned fridges

    def add_fridge(self):
        nickname = input("What would you like to name the fridge: ")
        self.__owned_fridges.append(fr(self.owner, nickname))
        print("Fridge added!")
 

class Fridge:
    def __init__(self, owner, nickname):
        self.nickname = nickname
        self.owner = owner
        self.__authorized_users = [owner]
        self.__contents = []

    def add_to_fridge(self):
        if len(self.__contents) == 5:
            print("Your fridge is full!")
        else:
            item = input("What would you like to add : ")
            self.__contents.append(item)

Моя проблема заключается в сериализации этого для JSON. Я обнаружил, что следующее работает для сериализации объекта ресторана в JSON, но не вложенных объектов холодильника :

data = {
    'restaurants': []
}

# Testing code
test = res("Jac", "350b534")
test.add_fridge()
test.add_fridge()
data['restaurants'].append(json.dumps(test.__dict__))

Я относительно новичок в python, и у меня есть опыт работы в js, поэтому я все еще знакомлюсь с синтаксисом. Мой вопрос в том, как мне сериализовать внутренний список холодильников?

json oop python
2021-11-24 03:41:22
1

Лучший ответ

0

Во-первых, я бы предложил проверить классы данных, так как они упростят задачу работы с классами в Python. С помощью dataclasses вам не нужно определять более сложные методы, такие как __init__ и __repr__ так как по умолчанию они будут сгенерированы автоматически.

Для вашего конкретного случая использования вы можете решить проблему с сериализацией модели вложенного класса в dict / Строка JSON с использованием необязательного default вызываемый, который вы можете передать в json.dumps. Например, вы можете передать лямбду (которая по сути является сокращенной функцией), такую как lambda o: o.__dict__, который извлекает __dict__ атрибут для объектов, которые по своей сути не сериализуются в JSON, как показано ниже.

from __future__ import annotations

import json
from dataclasses import dataclass


@dataclass
class A:
    my_string: str
    b: list[B]


@dataclass
class B:
    my_int: int
    password: str


a = A('test', [B(2, '123'), B(5, '321')])
print(a)
# A(my_string='test', b=[B(my_int=2, password='123'), B(my_int=5, password='321')])

print(json.dumps(a, default=lambda o: o.__dict__))
# {"my_string": "test", "b": [{"my_int": 2, "password": "123"}, {"my_int": 5, "password": "321"}]}

Но обратите внимание, что dataclasses также предоставляет вспомогательную функциюasdict если вам нужно преобразовать экземпляр класса данных в dict пример первый.


Однако, если у вас есть более продвинутый вариант использования - например, десериализация данных JSON во вложенную модель класса или сопоставление поля класса данных, например password к другому ключу JSON, такому как pw как и в приведенном примере - я бы предложил проверить библиотеку сериализации, такую как мастер классов данных, которая хорошо работает с вложенной моделью классов данных, как указано выше.

2021-11-24 05:02:30

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................