Serializarea o listă de cazuri de obiecte imbricate într-o instanță obiect python

0

Problema

Voi face o aplicație care ar permite să fie conectați-vă sau creați un restaurant. Ca un proprietar de restaurant, puteți adăuga/elimina/edita frigidere. Țelul meu este că nu aș avea o listă de Restaurante care aș scrie un fișier JSON, și oricând rulați din nou aplicația, pot trage datele în și simula "fiind un proprietar de restaurant" și editați frigidere pentru restaurantul ales.

În esență doresc acest lucru:

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

Am următoarele două clase(arată metode relevante):


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)

Problema mea este în serializarea asta pentru JSON. Am constatat că următoarele lucrări pentru a serializa restaurant obiect JSON, dar nu imbricate frigider obiecte :

data = {
    'restaurants': []
}

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

Eu sunt relativ nou pentru python, și eu vin dintr-un js de fundal, așa că eu sunt încă obtinerea familiarizat cu sintaxa. Intrebarea mea este, cum pot serializa interior listă de frigidere?

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

Cel mai bun răspuns

0

În primul rând, aș sugera verificarea dataclasses ca se va simplifica sarcina de a lucra cu clase în Python. Cu dataclasses, nu aveți nevoie pentru a defini dunder metode, cum ar fi __init__ și __repr__ cum vor fi generate în mod automat în mod implicit.

Pentru un anumit caz de utilizare, puteți rezolva problema cu serializarea o imbricate model de clasă pentru o dict / JSON string folosind un opțional default nevărsat că puteți trece la json.dumps. De exemplu, puteți trece un lambda (care este, în esență, o prescurtare funcție), precum lambda o: o.__dict__, care preia __dict__ atribute pentru obiecte care nu sunt în mod inerent serializable la JSON, așa cum se arată mai jos.

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

Dar, rețineți că dataclasses oferă, de asemenea, o funcția de helper asdict dacă aveți nevoie pentru a converti un dataclass exemplu la un dict exemplu prima.


Totuși, dacă aveți o utilizare mai avansate caz - de exemplu, de-serializarea date JSON pentru a o imbricate model de clasă, sau de cartografiere un dataclass domeniu, cum ar fi password la un alt JSON-cheie, cum ar fi pw ca și în listate exemplu - aș sugera verificarea o serialization library ca dataclass-wizard, care funcționează bine cu un imbricate dataclass model ca mai sus.

2021-11-24 05:02:30

În alte limbi

Această pagină este în alte limbi

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