将非类型化的python dict()转换为对象的类型化dict

2024-05-07 02:54:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我来自Java背景,在Java中可以将json序列化/反序列化到域模型中,如下所示:

{
    "id1": {
        "seq001": {
            "curr_seq": "seq001",
            "partition": "2014-05-16",
            "last_send": true
        },
        "seq002": {
            "curr_seq": "seq0012",
            "partition": "2014-05-167",
            "last_send": true
        }
        ..
    }
}

Java Json解析器可以直接反序列化为域模型,如下所示:

Map<String, Map<String, DatasetEnode>> idToSeqIdToDatasetNodeMap = OM.readValue(..)

我想在Python中做一些类似的事情,如下所示:

域类:

@dataclass(frozen=False)
class DatasetNode:
    curr_seq: str
    partition: str
    last_send: bool

首先解析Json:

raw_map: dict = json.load(json_str) #result is dict[str,dict[str,dict]]

现在我想要一些转换器方法,如下所示:

1将原始dict转换为数据类对象的dict:

typed_map: dict[str, dict[str, DatasetNode]] = to_typed(raw_map)

2将数据类对象的dict转换为原始dict

 raw_map: dict = to_raw(typed_map)

这是否可以在几行中完成,而不是编写长方法


Tags: 模型sendjsonmapraw序列化javaseq
1条回答
网友
1楼 · 发布于 2024-05-07 02:54:45

正如前面所说的,在使用Python时,您不应该用Java术语进行思考——在您看来,Python中没有任何东西是“类型化”的。 无论如何,尽管没有内置程序来执行您描述的任务,但这里有两个一行程序,它们将通过双字典完成这项工作

“原始”dict到“对象”dict

objd = {idk: {seqk:DatasetNode(*seqv) for seqk,seqv in rawd[idk].items()} for idk in rawd}

“对象”dict到“原始”dict

rawd = {idk: {seqk:asdict(seqv) for seqk,seqv in objd[idk].items()} for idk in objd}

相关问题 更多 >