Serializar una lista de instancias de objetos anidados dentro de una instancia de un objeto de python

0

Pregunta

Estoy haciendo una aplicación que le permitirá iniciar sesión o crear un restaurante. Como propietario de un restaurante, usted puede añadir/quitar/modificar refrigerador. Mi objetivo final es que me gustaría tener una lista de Restaurantes en los que me gustaría escribir a un archivo JSON, y en el momento que yo vuelva a ejecutar la aplicación, puedo extraer los datos y simular "ser dueño de un restaurante" y editar las neveras para el restaurante elegido.

Esencialmente me quiero esto:

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

Tengo las dos clases siguientes(mostrando los métodos relevantes):


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)

Mi problema está en que la serialización esta para JSON. He encontrado que las siguientes obras para serializar el restaurante objeto JSON, pero no la anidados nevera objetos :

data = {
    'restaurants': []
}

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

Soy relativamente nuevo en python, y vengo de un js de fondo, así que todavía estoy familiarizarse con la sintaxis. Mi pregunta es, ¿cómo serializar el interior de la lista de los frigoríficos?

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

Mejor respuesta

0

En primer lugar, me gustaría sugerir la comprobación hacia fuera dataclasses como se va a simplificar la tarea de trabajar con las clases en Python. Con dataclasses, no es necesario definir dunder métodos como __init__ y __repr__ como van a ser generados automáticamente por defecto.

Para su caso concreto, puede resolver el problema con serializar una clase anidada modelo para un dict / String JSON utilizando un opcional default callable que puede pasar en json.dumps. Por ejemplo, usted puede pasar una lambda (que es esencialmente una abreviatura de la función), tales como lambda o: o.__dict__, que recupera la __dict__ atributo de los objetos que no son inherentemente serializable para JSON, como se muestra a continuación.

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

Pero tenga en cuenta que dataclasses también ofrece una función de ayuda asdict si usted necesita para convertir un dataclass instancia a un dict ejemplo primero.


Sin embargo, si usted tiene un caso de uso más avanzado - por ejemplo, de-serializar los datos JSON a una clase anidada modelo, o la asignación de un dataclass campo, tales como password a otro JSON clave, tales como pw como en el ejemplo - yo sugeriría que la comprobación de una serialización de la biblioteca como el dataclass-asistente, que funciona bien con un anidada dataclass modelo como el anterior.

2021-11-24 05:02:30

En otros idiomas

Esta página está en otros idiomas

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