Я пытаюсь десериализовать сложный вложенный объект из 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'
(Я предполагаю, что вы используете 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())