Python中的安全和泛型序列化

2024-05-13 09:17:41 发布

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

我想将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不是静态类型的,所以我希望语法如下:

^{pr2}$

其中ClassName是预期的类。在

  1. jsonpickle是坏的,坏的,坏的。它的任意使用会导致绝对的代码执行
  2. 有序列化库:limamarshmallowkim,但所有这些库都需要手动定义序列化方案。事实上,这会导致代码重复,这很糟糕。在

在Python中,有什么可以用于简单、通用但安全的序列化吗?在

编辑:以前隐含的其他要求

  1. 处理嵌套序列化(serde可以这样做:https://gist.github.com/63bcd00691b4bedee781c49435d0d729
  2. 处理内置类型,即能够序列化和反序列化内置json模块可以处理的所有内容,而无需对内置类型进行特殊处理。在

Tags: tojson类型convertstring序列化内置serialized
1条回答
网友
1楼 · 发布于 2024-05-13 09:17:41

由于Python不需要类型注释,任何这样的库都需要

  1. 使用自己的类
  2. 利用类型注释。在

后者将是完美的解决方案,但我还没有找到任何图书馆这样做。在

不过,我找到了一个模块,它只需要定义一个类作为模型: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)

相关问题 更多 >