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

时间:2018-01-22 22:09:45

标签: python json jsonpickle

当使用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

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

2 个答案:

答案 0 :(得分:2)

新的做事方式。以上答案是古老的。

jsonpickle.encode(my_object,unpicklable = False)

答案 1 :(得分:1)

您可以在调用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)

来自文档here

  

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