#python #json
Пытаюсь записать в json объект класса Person вот так: def postUserToJson(user): fileName = str(user.FullName) + " - " + str(user.Id) file = open(pathUsers + fileName + ".json", "w", encoding="utf-8") json.dump(user, file, ensure_ascii=False) file.close() Получаю ошибку: TypeError: Object of type 'Person' is not JSON serializable Как записать в Json объект класса? Как его потом правильно десериализовать?
Ответы
Ответ 1
По ссылке в данном комментарии описана причина возникновения данной ошибки, а также что необходимо делать, если надо сериализовать неизвесный энкодеру тип. Тут приведу пример случая, когда создается типовой класс с набором аттрибутов, который подлежит сериализации. import json class Person: def __init__(self, name, age, **kwargs): self.name = name self.age = age self.attribute = kwargs or None class PersonEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, Person): return obj.__dict__ return json.JSONEncoder.default(self, obj) p = Person('Bob', 30, height=180, width=70) print(json.dumps(p, cls=PersonEncoder)) # {"name": "Bob", "age": 30, "attribute": {"height": 180, "width": 70}} p = Person('Bob', 30) print(json.dumps(p, cls=PersonEncoder)) # {"name": "Bob", "age": 30, "attribute": null} # Десериализация пример p = Person('Alice', 20, nationality='swede', salary=2000) with open('/tmp/person', 'w') as f: json.dump(p, f, cls=PersonEncoder) print(Person(**json.load(open('/tmp/person')))) # <__main__.Person object at 0x7efd996c91d0> Тут надо понимать, что под сериализацией в данном случае подразумевается лишь сохранение значений полей объекта. Если все поля задаются в конструкторе через принимаемые аргументы, то видно, что десериализация очень простая. Но сам объект нигде не сохраняется, поэтому по сохраненным данным создается новый. Это не pickle, который сможет сохранить объект и восстановать его при наличии определения класса в области видимости.
Комментариев нет:
Отправить комментарий