簡體   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