Как вернуть json вывод объектных диктов во вложенных объектах? - PullRequest
0 голосов
/ 08 февраля 2020

В проекте мне нужно вывести файл json для каких-то сущностей. так что этот вопрос как-то упрощенная версия моей проблемы. Представьте, что я получил эти классы, которые мне понадобятся для их dict свойств и атрибутов как json вывод:

from random import randint

class A:
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def out_dict(self):
        return self.__dict__

class B:
    def __init__(self, B_a, list_of_A):
        self.b_arg = B_a
        self.list_of_A = list_of_A
    def out_dict(self):
        return self.__dict__

class C:
    def __init__(self, C_a, list_of_B):
        self.c_arg = C_a
        self.list_of_B = list_of_B
    def out_dict(self):
        return self.__dict__

list_of_A = [A(randint(0,100), randint(0,100)) for _ in range(5)]
list_of_B = [B(5, list_of_A) for _ in range(3)]
c = C(10, list_of_B)
print(c.out_dict())

вывод приведенного выше кода:

{'c_arg': 10,
'list_of_B': [<__main__.B at 0x207613625c0>,
 <__main__.B at 0x2076110bdd8>,

Как видите, объекты являются вложенными, и в выводе не указаны все атрибуты классов в деталях. С другой стороны, мне нужен какой-то вывод, подобный этому:

{"C":
   {"list_of_B":[
    "B0": {
           {"list_of_A":
                {["0":{"a":10, "b":21}, "2":{"a":1, "b":3}, 
                  "1":{"a":10, "b":21}, "2":{"a":54, "b":12},
                  "2":{"a":10, "b":21}, "2":{"a":12, "b":32},
                ]}
            "b_arg": 27
            }


        },
    "B1": {
           {"list_of_A":
                {["0":{"a":10, "b":21}, "2":{"a":1, "b":3}, 
                  "1":{"a":10, "b":21}, "2":{"a":54, "b":12},
                  "2":{"a":10, "b":21}, "2":{"a":12, "b":32},
                ]}
            "b_arg": 27
            }


        },
               ]
    "c_arg": 95
   }
}

Как я могу получить подробности при таких обстоятельствах.

Мне нужно, чтобы они выводились как json.

Спасибо

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Если вы хотите иметь довольно обычные, но настраиваемые объекты, которые находятся в иерархии, но могут преобразовываться в иерархию типов python (целые числа, строки, списки и словесные выражения), то вы должны договориться, что они вызывают out_dict() рекурсивно для вас.

Попробуйте это:

from random import randint

class OutDict:
    def out_dict(self):
        out = {}
        for k,v in self.__dict__.items():
            if hasattr(v,'out_dict'):
                print('out_dict')
                out[k] = v.out_dict()
            elif isinstance(v,list):
                out[k] = self.out_list(v)
            else:
                out[k] = v
        return out

    def out_list(self, values):
        return [v.out_dict() if hasattr(v,'out_dict') else v for v in values]

class A(OutDict):
    def __init__(self, a, b):
        self.a = a
        self.b = b

class B(OutDict):
    def __init__(self, B_a, list_of_A):
        self.b_arg = B_a
        self.list_of_A = list_of_A

class C(OutDict):
    def __init__(self, C_a, list_of_B):
        self.c_arg = C_a
        self.list_of_B = list_of_B

list_of_A = [A(randint(0,100), randint(0,100)) for _ in range(5)]
list_of_B = [B(5, list_of_A) for _ in range(3)]
c = C(10, list_of_B)
print(c.out_dict())

Обратите внимание, как я создал пользовательский базовый класс OutDict, который имеет метод out_dict() (и вспомогательный * 1009). * method) какие классы A, B и C получены из.

Пример выходных данных:

{'c_arg': 10, 'list_of_B': [{'b_arg': 5, 'list_of_A': [{'a': 100, 'b': 93}, {'a': 82, 'b': 52}, {'a': 39, 'b': 63}, {'a': 24, 'b': 94}, {'a': 40, 'b': 95}]}, {'b_arg': 5, 'list_of_A': [{'a': 100, 'b': 93}, {'a': 82, 'b': 52}, {'a': 39, 'b': 63}, {'a': 24, 'b': 94}, {'a': 40, 'b': 95}]}, {'b_arg': 5, 'list_of_A': [{'a': 100, 'b': 93}, {'a': 82, 'b': 52}, {'a': 39, 'b': 63}, {'a': 24, 'b': 94}, {'a': 40, 'b': 95}]}]}
0 голосов
/ 08 февраля 2020

Ваш основной лог c правильный.
Проблема, однако, в том, что ваши переменные list_of_A, list_of_B и c указывают на ваш класс, в то время как вас больше всего интересует метод out_dict() этого класса.
Простое выполнение чего-то вроде

from random import randint
class A:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def out_dict(self):
        return self.__dict__

class B:
    def __init__(self, B_a, list_of_A):
        self.b_arg = B_a
        self.list_of_A = list_of_A
    def out_dict(self):
        return self.__dict__

class C:
    def __init__(self, C_a, list_of_B):
        self.c_arg = C_a
        self.list_of_B = list_of_B
    def out_dict(self):
        return self.__dict__

list_of_A = [A(randint(0,100), randint(0,100)).out_dict() for _ in range(5)]
#This                                         ^
list_of_B = [B(5, list_of_A).out_dict() for _ in range(3)]
#Solves                     ^
c = C(10, list_of_B).out_dict()
#It                 ^
print(c)

Исправляет проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...