La serializzazione di un elenco di istanze di oggetti nidificati all'interno di un'istanza di un oggetto python

0

Domanda

Sto facendo un'applicazione che ti permetterà di effettuare il login o creare un ristorante. Come proprietario di un ristorante, è possibile aggiungere/rimuovere/modificare i frigoriferi. Il mio obiettivo finale è che mi piacerebbe avere un elenco di Ristoranti che mi piacerebbe scrivere un file JSON, e in qualsiasi momento, eseguire di nuovo l'app, posso estrarre i dati e simulare di essere proprietario di un ristorante" e modificare i frigoriferi per il ristorante prescelto.

Io essenzialmente vuole questo:

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

Ho i seguenti due classi(mostrando metodi pertinenti):


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)

Il mio problema è la serializzazione di questo per JSON. Ho trovato che le seguenti opere di serializzare il ristorante oggetto JSON, ma non nidificata frigorifero oggetti :

data = {
    'restaurants': []
}

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

Io sono relativamente nuovo a python, e vengo da un js sfondo, quindi sono ancora familiarizzare con la sintassi. La mia domanda è, come faccio a serializzare l'interno elenco dei frigoriferi?

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

Migliore risposta

0

In primo luogo, io suggerirei di verificare dataclasses come si semplificherà il compito di lavorare con classi in Python. Con dataclasses, non è necessario definire dunder metodi come __init__ e __repr__ come saranno generati automaticamente per impostazione predefinita.

Per il tuo caso particolare, è possibile risolvere il problema con la serializzazione di una classe nidificata modello per un dict / Stringa JSON utilizzando un optional default callable che si può passare a json.dumps. Per esempio, si può passare una lambda (che è essenzialmente una scorciatoia in funzione) come lambda o: o.__dict__, che recupera il __dict__ attributo per gli oggetti che non sono intrinsecamente serializzabile in JSON, come mostrato di seguito.

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

Ma nota che dataclasses fornisce anche una funzione di supporto asdict se avete bisogno di convertire un dataclass istanza di un dict istanza di prima.


Però, se si ha un utilizzo più avanzato il caso, ad esempio, de-serializzazione JSON dati a una classe nidificata modello, o il mapping di un dataclass campo come password un altro JSON chiave come pw come nella elencati esempio - io suggerirei di verificare una serializzazione biblioteca come dataclass-guidata, che funziona bene con un nidificati dataclass modello come sopra.

2021-11-24 05:02:30

In altre lingue

Questa pagina è in altre lingue

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