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


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

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


5583
2017-08-09 13:10


起源



答案:


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

jsonpickle   支持 pickle 模  __getstate__ 和 __setstate__ 方法。如果您的类实现了这两个方法,那么返回的内容将被使用 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__ 不是一个选项,你也可以注册一个 自定义序列化处理程序 为你的班级;缺点是虽然 __getstate__ 只需返回一个字典就可以逃脱,自定义处理程序需要返回一个完全展平的值。


11
2017-08-09 13:30



添加 __getstate__ 和 __setstate__ 就像现在的魅力,谢谢你。而不是为每个模型编写相同的代码行,实现装饰器以从中删除被忽略的字段 __dict__ 对未来可能是一个好主意。 - mkubilayk
我认为mkubilayk对未来功能的期望是什么,它将非常类似于.NET的xml序列化 XmlAttributes.XmlIgnore属性 - jxramos


答案:


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

jsonpickle   支持 pickle 模  __getstate__ 和 __setstate__ 方法。如果您的类实现了这两个方法,那么返回的内容将被使用 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__ 不是一个选项,你也可以注册一个 自定义序列化处理程序 为你的班级;缺点是虽然 __getstate__ 只需返回一个字典就可以逃脱,自定义处理程序需要返回一个完全展平的值。


11
2017-08-09 13:30



添加 __getstate__ 和 __setstate__ 就像现在的魅力,谢谢你。而不是为每个模型编写相同的代码行,实现装饰器以从中删除被忽略的字段 __dict__ 对未来可能是一个好主意。 - mkubilayk
我认为mkubilayk对未来功能的期望是什么,它将非常类似于.NET的xml序列化 XmlAttributes.XmlIgnore属性 - jxramos