Avatar ·

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 объект класса?

Как его потом правильно десериализовать?

Avatar ·

По ссылке в описана причина возникновения данной ошибки, а также что необходимо делать, если надо сериализовать неизвесный энкодеру тип.

Тут приведу пример случая, когда создается типовой класс с набором аттрибутов, который подлежит сериализации.

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, который сможет сохранить объект и восстановать его при наличии определения класса в области видимости.

Войдите чтобы оставить ответ

Блоги