如何使用jsonpickle排除序列化时的特定字段?

2024-04-26 09:26:01 发布

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

我用的是SQLAlchemy延长瓶。在使用jsonpickle序列化我的模型(也用于数据库操作)时,我希望忽略一些特定的属性。有没有办法让我来制定这些规则?

SQLAlchemy向对象添加名为_sa_instance_state的属性。总之,我不希望这个字段出现在JSON输出中。


Tags: 对象instance模型数据库json属性序列化sqlalchemy
2条回答

这个将帮助其他人完成他们的任务:

在自定义的jsonpickle包中创建这样的类:

class SetGetState:
    def __getstate__(self):
        state = self.__dict__.copy()
        try:
            class_name = '_' + self.__class__.__name__ + '__'
            new_items = {key:value for key, value in state.items() if class_name not in key}
            return new_items
        except KeyError:
            pass
        return state

在类中继承这个不需要私有属性序列化

class Availability(jsonpickle.SetGetState):
    pass

不能告诉默认类pickler忽略某些内容,不

jsonpickle不支持^{} module^{}^{}方法。如果您的类实现了这两个方法,那么返回的内容将由jsonpickle用来表示状态。两种方法都需要实现。

如果__getstate__未实现,则jsonpickle将使用__dict__属性,因此您自己的版本只需使用相同的字典,删除_sa_instance_state键即可:

def __getstate__(self):
    state = self.__dict__.copy()
    del state['_sa_instance_state']
    return state

def __setstate__(self, state):
    self.__dict__.update(state)

无论__getstate__返回是什么,都将被进一步、递归地处理,不必担心在那里处理子对象。

如果添加__getstate____setstate__不是一个选项,您还可以为类注册custom serialization handler;缺点是,虽然__getstate__只需返回字典就可以了,但是自定义处理程序将需要返回一个完全展平的值。

相关问题 更多 >