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

时间:2013-08-09 13:10:17

标签: python json sqlalchemy flask jsonpickle

我正在使用Flask的SQLAlchemy扩展。在使用jsonpickle序列化我的模型(也用于数据库操作)时,我想要忽略一些特定的属性。有没有办法让我设定这些规则?

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

2 个答案:

答案 0 :(得分:16)

你不能告诉默认的类选择器忽略某些东西,没有。

jsonpickle 支持pickle module __getstate____setstate__方法。如果您的类实现了这两个方法,则jsonpickle将使用返回的任何内容来代表状态。这两种方法都需要实施。

如果__getstate__未实现 ,则jsonpickle会使用__dict__属性,因此您自己的版本只需要使用相同的字典,删除{ {1}}密钥,您完成了:

_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__,您还可以为您的班级注册custom serialization handler;缺点是虽然__setstate__只能返回一个字典,但自定义处理程序需要返回一个完全展平的值。

答案 1 :(得分:0)

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

在像您的自定义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