首页 > 解决方案 > Python中嵌套NamedTuples的JSON反序列化

问题描述

嵌套 NamedTuples 的 JSON 序列化很简单:

import json
from typing import NamedTuple

class A(NamedTuple):
    a: int
class B(NamedTuple):
    a: A
    b: str
s = json.dumps(B(A(42), "auie"))
print(s) # outputs the following string: "[[42], 'auie']"

另一方面,JSON 反序列化需要一些工作……最好的方法是什么?我想使用递归函数,但我希望会有一个更简洁的实现......</p>

def deserialize(T,l):
    for i, k in enumerate(T._field_types):
        if hasattr(T._field_types[k], "_field_types"): # I'm open to a more robust check
            l[i] = deserialize(T._field_types[k], l[i])
    return T(*l)
    
print(deserialize(B, json.loads(s))) # prints B(a=A(a=42), b='auie')

标签: pythonserializationnamedtuple

解决方案


您可能想研究pydantic,它具有许多用于序列化和反序列化对象的功能。它还允许将对象设置为不可变,请参见此处


推荐阅读