避免使用 py/id 指针指向另一个对象的 jsonpickle



当一个对象使用 jsonpickle 序列化为 json 时,我注意到诸如日期时间之类的对象被存储一次,然后将来的使用被存储为引用值,例如 {"py/id":1} .是否可以存储实际值而不是参考?此引用似乎是隐藏的,并且在直接与数据库交互时会令人困惑。

前任。 class MyClass: def __init__(self, eee): now = datetime.datetime.utcnow() self.ddd = now self.ddd2 = now self.ddd3 = now

杰森是 {"py/object": "__main__.MyClass", "py/state": {"ddd": {"py/object": "datetime.datetime", "__reduce__": [{"py/type": "datetime.datetime"}, ["B+IBFhYJCwx9oQ=="]]}, "ddd2": {"py/id": 1}, "ddd3": {"py/id": 1}, "eee": "fwaef"}}

新的做事方式。上面的答案很旧。

jsonpickle.encode(my_object, unpicklable=False(

调用 jsonpickle.encode 时可以使用 make_refs 参数:

import datetime
import jsonpickle
class MyClass:
    def __init__(self, eee):
        now = datetime.datetime.utcnow()
        self.ddd = now
        self.ddd2 = now
        self.ddd3 = now
my_object = MyClass('hi')
jsonpickle.encode(my_object, make_refs=False)

从此处的文档:

make_refs – 如果设置为 False jsonpickle 的引用支持,则禁用。id((-相同的对象不会在encode((/decode((中保留,但生成的JSON流在概念上会更简单。jsonpickle 检测循环对象,并将通过调用 repr(( 来打破循环,而不是在make_refs设置为 False 时递归。

在尝试简化 jsonpickle 编码输出时,应该了解 make_refs=Falseunpicklable=False 之间的区别:

make_refs=False将阻止 jsonpickle 创建对相同对象的引用(那些py/id属性(。引用使输出更紧凑,但可读性较差,因此人们可能更喜欢make_refs=False而牺牲更大的文件。但是,生成的文件仍然可以解码回 Python 对象。

unpicklable=False字面意思是 jsonpickle 输出不能被取消酸洗,即解码,到它的原始类型。输出再次更具可读性,但是如果您正在编码的对象包含非本机数据类型(即您定义的类(,则编码输出将存储这些对象属性的值,但是如果您尝试将文件解码回其 python 表示形式,则对象将是字典,而不是类的实例。

尝试使用设置为 False不可挑选的 attrubute

import datetime
import jsonpickle
class MyClass:
    def __init__(self, eee):
        now = datetime.datetime.utcnow()
        self.ddd = now
        self.ddd2 = now
        self.ddd3 = now
my_object = MyClass('hi')
jsonpickle.encode(my_object, unpicklable=False)

最新更新