4

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

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

json是 {"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"}}

4

3 回答 3

9

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

jsonpickle.encode(my_object, unpicklable=False)

于 2020-08-28T11:57:28.860 回答
4

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

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 检测循环对象,并在 make_refs 设置为 False 时通过调用 repr() 而不是递归来打破循环。

于 2018-02-04T22:51:32.570 回答
0

尝试使用unpicklable属性设置为False

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)
于 2021-10-14T15:34:29.233 回答