使用jsons库反序列化复杂嵌套JSON对象时,如何让嵌套对象保留正确类型?
jsons库反序列化复杂嵌套JSON对象时,如何让嵌套对象保留正确类型?
嘿,这个问题我之前也碰到过!其实核心原因是jsons库需要明确知道每个属性对应的目标类型,才能把JSON里的字典/列表转换成对应的类实例——你原来的代码里没给类属性加类型注解,导致库没法自动推断嵌套对象的类型,只能转成默认的dict和list。
解决方法很简单,给每个类的属性加上类型提示就行,这样jsons就能准确识别嵌套对象的类型并完成反序列化了。下面是修改后的完整代码:
from typing import List import jsons class Inner: def __init__(self): self.enabled: bool = False self.name: str = "Inner" class Middle: def __init__(self): self.name: str = "Middle" self.inners: List[Inner] = [] for x in range(4): self.inners.append(Inner()) class Outer: def __init__(self): self.name: str = "Outer" self.middles: List[Middle] = [] 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(type(reloaded.middles[1])) # --> <class '__main__.Middle'> print(type(reloaded.middles[1].inners[0])) # --> <class '__main__.Inner'> print(reloaded.middles[1].name) # --> Middle
补充说明:
jsons库依赖Python的类型提示做类型推断,当你给Middle.inners标注为List[Inner]、Outer.middles标注为List[Middle]后,库就知道要把JSON数组里的每个字典转换成对应的Inner或Middle实例,而不是停留在dict类型。
如果不想用类型注解,也可以在loads时手动指定嵌套类型(不过这种方式比较繁琐,更推荐类型注解):
from typing import List reloaded = jsons.loads(myJson, cls=Outer, types={'middles': List[Middle], 'inners': List[Inner]})
备注:内容来源于stack exchange,提问作者jlj
相关产品推荐
相关产品推荐

