Sérialisation d'une liste des instances d'objets imbriqués au sein d'une instance d'objet python

0

La question

Je suis en train de faire une application qui vous permettra soit de vous connecter ou de créer un restaurant. En tant que propriétaire d'un restaurant, vous pouvez ajouter/supprimer/modifier un réfrigérateur. Mon objectif final est que j'aurais une liste de Restaurants que j'avais l'écrire dans un fichier JSON, et à chaque fois que je exécutez à nouveau l'application, je peux extraire des données et simuler "étant un propriétaire de restaurant" et de modifier les frigos pour le restaurant choisi.

J'ai essentiellement veux ceci:

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

J'ai deux classes suivantes(en montrant les méthodes pertinentes):


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)

Mon problème est dans la sérialisation de cette JSON. J'ai trouvé que les œuvres suivantes de sérialiser le restaurant de l'objet en JSON, mais pas imbriquée réfrigérateur objets :

data = {
    'restaurants': []
}

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

Je suis relativement nouveau à python, et je viens d'un js de fond, donc je suis encore à se familiariser avec la syntaxe. Ma question est, comment puis-je sérialiser l'intérieur de la liste de réfrigérateurs?

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

La meilleure réponse

0

Tout d'abord, je vous suggère de vérifier dataclasses comme ils permettront de simplifier la tâche de travailler avec des classes en Python. Avec dataclasses, vous n'avez pas besoin de définir dsous méthodes comme __init__ et __repr__ comme ils seront générés automatiquement par défaut.

Pour votre cas d'utilisation particulier, vous pouvez résoudre le problème avec la sérialisation d'une classe imbriquée modèle à un dict / Chaîne JSON à l'aide d'une option default callable que vous pouvez passer à json.dumps. Par exemple, vous pouvez passer un lambda (qui est essentiellement une abréviation de la fonction), tels que lambda o: o.__dict__qui récupère l' __dict__ attribut pour les objets qui ne sont pas intrinsèquement la sérialisation JSON, comme indiqué ci-dessous.

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"}]}

Mais notez que dataclasses fournit également une fonction d'assistance asdict si vous avez besoin de convertir un dataclass exemple à un dict exemple première.


Cependant, si vous avez une utilisation plus poussée de cas - par exemple, la dé-sérialisation des données JSON à une classe imbriquée modèle, ou une cartographie de l'dataclass domaine, telles que password à l'autre JSON clés tels que pw comme dans la liste des exemple - je vous suggère de regarder la sérialisation de la bibliothèque comme le dataclass-assistant, qui fonctionne bien avec un imbriquée dataclass modèle comme ci-dessus.

2021-11-24 05:02:30

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................