Как исключить определенные поля при сериализации с помощью 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