繁体   English   中英

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

[英]How to exclude specific fields on serialization with jsonpickle?

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

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

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

jsonpickle 确实支持pickle模块 __getstate____setstate__方法。 如果您的类实现了这两个方法,那么jsonpickle将使用返回的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__将以递归方式进一步处理,因此无需担心在那里处理子对象。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM