【问题标题】:convert untyped python dict() to typed dict of objects将无类型的 python dict() 转换为对象的类型化字典
【发布时间】:2021-06-15 10:21:28
【问题描述】:

我来自 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解析器可以直接反序列化成Domain模型如下:

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 将原始字典转换为数据类对象的字典:

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

2 将dataclass对象的dict转成raw dict

 raw_map: dict = to_raw(typed_map)

这是否可以用几行代码完成,而不是编写长方法?

【问题讨论】:

  • 没有内置的方法可以做到这一点。有图书馆可以促进这一点。 marshmallowpydantic。其他几个我确定。
  • 顺便说一句,在这种情况下,我认为“打字”不是正确的词
  • 你可以使用理解。 {i: {k: DatasetNode(**v) for k, v in j.items()} for i, j in raw_map.items()} 但 IMO 的可读性不如深呼吸和多写几行。
  • 我还建议像 dataclasses-jsondataclass-wizard 这样的库。甚至还有dataclass-factory。许多 Python 库已经存在用于数据类的序列化目的。

标签: python python-3.x dictionary


【解决方案1】:

正如已经说过的,在使用 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}

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2021-12-06
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多