【发布时间】: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)
这是否可以用几行代码完成,而不是编写长方法?
【问题讨论】:
-
没有内置的方法可以做到这一点。有图书馆可以促进这一点。
marshmallow,pydantic。其他几个我确定。 -
顺便说一句,在这种情况下,我认为“打字”不是正确的词
-
你可以使用理解。
{i: {k: DatasetNode(**v) for k, v in j.items()} for i, j in raw_map.items()}但 IMO 的可读性不如深呼吸和多写几行。 -
我还建议像
dataclasses-json和dataclass-wizard这样的库。甚至还有dataclass-factory。许多 Python 库已经存在用于数据类的序列化目的。
标签: python python-3.x dictionary