You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:03:18