当一个对象使用 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=False
和 unpicklable=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)