Serialização de uma lista de instâncias de objetos aninhados dentro de uma instância de objeto python

0

Pergunta

Eu estou fazendo um aplicativo que permite que você faça login ou crie um restaurante. Como proprietário de um restaurante, você pode adicionar/remover/editar frigoríficos. Meu objetivo final é a de que eu teria uma lista de Restaurantes que eu ia escrever para um arquivo JSON, e a qualquer momento que eu volte a executar o app, eu posso extrair dados e simular "ser proprietário de um restaurante" e editar o geladeiras para o restaurante escolhido.

Essencialmente eu quero esse:

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

Eu tenho os dois seguintes classes(mostrando os 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)

O meu problema é na serialização isso para JSON. Eu descobri que as seguintes obras para serializar o restaurante objeto para JSON, mas não o aninhadas frigorífico objetos :

data = {
    'restaurants': []
}

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

Eu sou relativamente novo para python, e eu venho de um js de plano de fundo, então eu ainda estou começando familiarizado com a sintaxe. A minha pergunta é, como faço para serializar o interior lista de frigoríficos?

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

Melhor resposta

0

Em primeiro lugar, eu sugiro conferir dataclasses como eles vão simplificar a tarefa de trabalhar com classes em Python. Com dataclasses, você não precisa definir dunder métodos como __init__ e __repr__ como eles serão gerados automaticamente por padrão.

Para o seu uso particular caso, você pode resolver o problema com a serialização de uma classe aninhada modelo para um dict / JSON cadeia de caracteres usando um opcional default exigível que você pode passar para json.dumps. Por exemplo, você pode passar um lambda (que é, essencialmente, uma forma abreviada de função), tais como lambda o: o.__dict__, que recupera o __dict__ atributo para objetos que não são inerentemente serializable para JSON, como mostrado abaixo.

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

Mas note-se que dataclasses também fornece uma função auxiliar asdict se você precisa converter um dataclass instância, uma dict instância primeira.


Porém, se você tem uma tecnologia mais avançada de caso de uso - por exemplo, de-serialização JSON dados para uma classe aninhada modelo, ou o mapeamento de um dataclass de campo, tais como password a outra chave, tais como JSON pw como no exemplo, eu sugiro conferir uma serialização biblioteca como a dataclass-assistente, que funciona bem com uma aninhadas dataclass modelo acima.

2021-11-24 05:02:30

Em outros idiomas

Esta página está em outros idiomas

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