Страницы

Поиск по вопросам

пятница, 3 января 2020 г.

TypeError: Object of type is not JSON serializable

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

Комментариев нет:

Отправить комментарий