Сериализовать /Deserialize список объектов с помощью json и python

65
7

Как я сериализую список объектов (Person) в json файл, а затем читаю этот json файл и десериализую их обратно на объекты? Я знаю, как писать в json файл, но я не понимаю, как правильно преобразовать объекты в json.

Ниже приведен мой упрощенный фрагмент кода. У меня есть список, содержащий двух человек, и я хочу сериализовать их и сохранить в json файл. Затем десериализуйте их обратно на объекты типа People.

Спасибо за помощь.

import json

class Person(object):
def __init__(self, name, nickname):
self.name = name
self.age = 0
self.nickname = nickname

# create a few people
A = Person('John', 'Joker')
B = Person('Marisa', 'Snickerdoodle')

# add people to list
peeps = []
peeps.append(A)
peeps.append(B)

# dummy data saving to json for testing
data = {
'name' : 'ACME',
'shares' : 100,
'price' : 542.23
}

with open('data.json', 'w') as outfile:
json.dump(data, outfile)

спросил(а) 2021-01-19T11:16:56+03:00 9 месяцев, 1 неделя назад
1
Решение
79

Вы не можете сериализовать пользовательские классы с помощью JSON.

Вместо этого вы должны использовать модуль pickle. Из документов:

https://docs.python.org/3/library/pickle.html#comparison-with-json

JSON по умолчанию может представлять только подмножество встроенных типов Python и не настраиваемых классов;

Акцент мой.

Кроме того, с http://www.json.org/:

JSON построен на двух структурах:

    Коллекция пар имя/значение. На разных языках это реализуется как объект, запись, структура, словарь, хеш-таблица, список клавиш или ассоциативный массив. Упорядоченный список значений. В большинстве языков это реализуется как массив, вектор, список или последовательность.

Опять же, акцент мой. В python вы можете сериализовать словари или списки, содержащие значения, где значения могут быть:

Значение может быть строкой в двойных кавычках, или числом, или истинным или ложным или нулевым, или объектом или массивом. Эти структуры могут быть вложенными.

ответил(а) 2021-01-19T11:16:56+03:00 9 месяцев, 1 неделя назад
79

Модуль json ожидает списки, dicts, строки, числа, логические значения и None, а не пользовательские классы. Вам нужно сделать словарь из своего экземпляра People. Простой способ сделать это - с vars(A).

ответил(а) 2021-01-19T11:16:56+03:00 9 месяцев, 1 неделя назад
65

Добавьте метод to_dict к вашему классу person. попробуй это

In [2]: class Person(object):
...: def __init__(self, name, nickname):
...: self.name = name
...: self.age = 0
...: self.nickname = nickname
...: def to_dict(self):
...: data = {}
...: data['name'] = self.name
...: data['age'] = self.age
...: return data
...:
peeps = []
peeps.append(A.to_dict())
peeps.append(B.to_dict())

In [9]: with open('data.json', 'w') as outfile:
...: json.dump(peeps, outfile)

In [10]: !cat data.json
[{"age": 0, "name": "John"}, {"age": 0, "name": "Marisa"}]

Обновление: для десериализации json для объекта python

In [4]: with open('data.json', 'r') as infile:
.... data = json.loads(infile.read())
...:
In [5]: A = Person(data[0]['name'], data[0]['nickname'])

ответил(а) 2021-01-19T11:16:56+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема