我想(反)将Python中的简单对象序列化为人类可读的(例如JSON)格式。数据可能来自不受信任的源。我真的很喜欢锈蚀图书馆的工作方式:
#[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中,有什么可以用于简单的、通用的、安全的序列化吗?
编辑:以前隐含的其他要求
json模块能够实现的所有内容,而无需对内置类型进行特殊处理。发布于 2017-08-22 08:18:16
因为Python不需要类型注释,所以任何这样的库都需要
后者将是一个完美的解决方案,但我还没有找到任何这样的图书馆。
不过,我找到了一个模块,它只需要将一个类定义为模型:https://github.com/dimagi/jsonobject
用法示例:
import jsonobject
class Node(jsonobject.JsonObject):
    id = jsonobject.IntegerProperty(required=True)
    name = jsonobject.StringProperty(required=True)
class Transaction(jsonobject.JsonObject):
    provider = jsonobject.ObjectProperty(Node)
    requestor = jsonobject.ObjectProperty(Node)
req = Node(id=42, name="REQ")
prov = Node(id=24, name="PROV")
tx = Transaction(provider=prov, requestor=req)
js = tx.to_json()
tx2 = Transaction(js)
print(tx)
print(tx2)发布于 2020-01-28 21:00:46
对于Python,我首先检查输入的大小。唯一的安全风险是通过发送一个巨大的文件来运行json.load()。
一旦解析了JSON,请考虑运行模式验证器(如PyKwalify )。
https://stackoverflow.com/questions/45797830
复制相似问题