【发布时间】:2018-01-29 13:42:21
【问题描述】:
我想将 Python 中的简单对象(反)序列化为人类可读的(例如 JSON)格式。数据可能来自不受信任的来源。我真的很喜欢 Rust 库 serde 的工作方式:
#[derive(Serialize, Deserialize, Debug)]
struct Point {
x: i32,
y: i32,
}
fn main() {
let point = Point { x: 1, y: 2 };
// Convert the Point to a JSON string.
let serialized = serde_json::to_string(&point).unwrap();
// Prints serialized = {"x":1,"y":2}
println!("serialized = {}", serialized);
// Convert the JSON string back to a Point.
let deserialized: Point = serde_json::from_str(&serialized).unwrap();
// Prints deserialized = Point { x: 1, y: 2 }
println!("deserialized = {:?}", deserialized);
}
我想在 Python 中实现这样的目标。由于 Python 不是静态类型的,我希望语法类似于:
deserialized = library.loads(data_str, ClassName)
ClassName 是预期的类。
-
jsonpickle很糟糕,很糟糕,很糟糕。它绝对不会进行任何清理,并且它的使用会导致任意代码执行 - 有序列化库:
lima、marshmallow、kim,但它们都需要手动定义序列化方案。事实上,这会导致代码重复,这很糟糕。
有什么我可以在 Python 中用于简单、通用且安全的序列化的东西吗?
编辑:之前隐含的其他要求
- 处理嵌套序列化(serde 可以做到:https://gist.github.com/63bcd00691b4bedee781c49435d0d729)
- 处理内置类型,即能够序列化和反序列化内置
json模块可以处理的所有内容,而无需对内置类型进行特殊处理。
【问题讨论】:
-
举一个例子,说明它是如何与内置类型一起工作的。如何从一个 json 对象到一个列表?
-
例如
deserialize('[1, 3]', List[int])?基本上,如果给定了一个类型,就可以反序列化内置的json模块可以的任何东西。
标签: python json python-3.x serialization