TypeError: Object of type is not JSON serializable
📁 python
Пытаюсь записать в 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 объект класса?
Как его потом правильно десериализовать?
По ссылке в описана причина возникновения данной ошибки, а также что необходимо делать, если надо сериализовать неизвесный энкодеру тип.
Тут приведу пример случая, когда создается типовой класс с набором аттрибутов, который подлежит сериализации.
import jsonclass Person: def __init__(self, name, age, **kwargs): self.name = name self.age = age self.attribute = kwargs or Noneclass PersonEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, Person): retu obj.__dict__ retu 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, который сможет сохранить объект и восстановать его при наличии определения класса в области видимости.
Войдите чтобы оставить ответ
Блоги