Как десериализовать сложный вложенный объект из JSON с помощью jsons

Я пытаюсь десериализовать сложный вложенный объект из JSON, используя библиотеку jsons. Возвращенный объект из jsons.loads имеет правильный тип, но все вложенные объекты имеют тип «dict».

Есть ли способ десериализации в полный вложенный объект, где вложенные объекты имеют правильный тип?

Вот базовый пример:

import jsons

class Inner:
    def __init__(self):
        self.enabled = False
        self.name = "Inner"
    
class Middle:
    def __init__(self):
        self.name = "Middle"
        self.inners = []
        for x in range(4): self.inners.append(Inner())      

class Outer:
    def __init__(self):
        self.name = "Outer"
        self.middles = []
        for x in range(3): self.middles.append(Middle())
            
myOuter = Outer()
print (type(myOuter))             # --> <class '__main__.Outer'>
print (myOuter.middles[1].name)   # --> Middle

myJson = jsons.dumps(myOuter)
reloaded = jsons.loads(myJson, cls=Outer)
print (type(reloaded))             # -->  <class '__main__.Outer'>
print (reloaded.name)              # -->  Outer
print (type(reloaded.middles[1]))  # -->  <class 'dict'>
print (reloaded.middles[1].name)   # -->  AttributeError: 'dict' object has no attribute 'name'

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

(Я предполагаю, что вы используете jsons) Вы должны сказать jsons какой тип субдиктов.

Вы можете сделать это, определив атрибуты класса и их типы. Вот краткий пример с классом Outer:

class Outer:
    middles: list[Middle]

При этом вот результат ваших двух последних строк:

print(type(reloaded.middles[1]))  # <class '__main__.Middle'>
print(reloaded.middles[1].name)  # Middle

Вот полные изменения, которые вам нужно внести в свой код:

class Inner:
    def __init__(self):
        self.enabled = False
        self.name = "Inner"


class Middle:
    inners: list[Inner]

    def __init__(self):
        self.name = "Middle"
        self.inners = []
        for x in range(4): self.inners.append(Inner())


class Outer:
    middles: list[Middle]

    def __init__(self):
        self.name = "Outer"
        self.middles = []
        for x in range(3): self.middles.append(Middle())

Другие вопросы по теме