Как исключить определенные поля при сериализации с помощью jsonpickle?

Я использую расширение SQLAlchemy с Flask. При сериализации моих моделей (которые также используются для операций с базами данных) с использованием jsonpickle, я хочу, чтобы некоторые специфические атрибуты игнорировались. Есть ли способ, который позволяет мне установить эти правила?

SQLAlchemy добавляет атрибут с именем _sa_instance_state к объекту. Одним словом, я не хочу, чтобы это поле было в выводе JSON.

1 ответ

Решение

Вы не можете сказать, что средство выбора классов по умолчанию игнорирует что-то, нет.

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__ можно просто вернуть словарь, пользовательский обработчик должен будет вернуть полностью сглаженное значение.

Этот поможет другим выполнить свою задачу:

Сделайте класс как этот в пакете как ваш обычай 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
Другие вопросы по тегам