Сериализация дочерних коллекций в Python (с помощью jsonpickle)
Я хотел бы сериализовать список Python, который содержит вложенные списки. Приведенный ниже код создает объект, который будет сериализован из набора ключей gnome, но кодер jsonpickle не сериализует дочерние списки. С unpicklable=True
Я просто получаю:
[{"py/object": "__main__.Collection", "label": ""}, {"py/object": "__main__.Collection", "label": "Login"}]
Я экспериментировал с настройкой / не настройкой max_depth
и пробовал много чисел глубины, но независимо, сборщик будет только мариновать предметы верхнего уровня.
Как заставить сериализовать всю структуру объекта?
#! /usr/bin/env python
import secretstorage
import jsonpickle
class Secret(object):
label = ""
username = ""
password = ""
def __init__(self, secret):
self.label = secret.get_label()
self.password = '%s' % secret.get_secret()
attributes = secret.get_attributes()
if attributes and 'username_value' in attributes:
self.username = '%s' % attributes['username_value']
class Collection(object):
label = ""
secrets = []
def __init__(self, collection):
self.label = collection.get_label()
for secret in collection.get_all_items():
self.secrets.append(Secret(secret))
def keyring_to_json():
collections = []
bus = secretstorage.dbus_init()
for collection in secretstorage.get_all_collections(bus):
collections.append(Collection(collection))
pickle = jsonpickle.encode(collections, unpicklable=False);
print(pickle)
if __name__ == '__main__':
keyring_to_json()
1 ответ
Я столкнулся с этой же проблемой и смог ее решить, переместив объявление массивов в init:
class Collection(object):
label = ""
# secrets = [] (move this into __init__)
def __init__(self, collection):
self.secrets = []
self.label = collection.get_label()
for secret in collection.get_all_items():
self.secrets.append(Secret(secret))