Reputation: 6147
How do i serialize a list of objects(Person) to a json file and then read that json file back and deserialize them back into objects? I know how to write to a json file but i'm not clear on how to convert my objects to json properly.
Below is my simplified snippet of code. I have a list containing two people and i want to serialize them and save to a json file. Then deserialize them back to objects of type People.
Thanks for the help.
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)
Upvotes: 2
Views: 12883
Reputation: 61
You can create a method for the class to deserialize json
import json
class Person:
...
def from_json(self, j):
self.__dict__ = json.loads(j)
Upvotes: 0
Reputation: 1797
add to_dict method to your person class. try this
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"}]
Update: To deserialize json to python object
In [4]: with open('data.json', 'r') as infile:
.... data = json.loads(infile.read())
...:
In [5]: A = Person(data[0]['name'], data[0]['nickname'])
Upvotes: 2
Reputation: 95907
You cannot serialize custom classes using JSON.
You should use the pickle
module instead. From the docs:
https://docs.python.org/3/library/pickle.html#comparison-with-json
JSON, by default, can only represent a subset of the Python built-in types, and no custom classes;
Emphasis mine.
Also, from http://www.json.org/:
JSON is built on two structures:
- A collection of name/value pairs. In various languages, this is realized as an object, record, struct, dictionary, hash table, keyed list, or associative array.
- An ordered list of values. In most languages, this is realized as an array, vector, list, or sequence.
Again, emphasis is mine. In python, you can serialize dictionaries or lists that contain values, where values can be:
A value can be a string in double quotes, or a number, or true or false or null, or an object or an array. These structures can be nested.
Upvotes: 1
Reputation: 36013
The json
module expects lists, dicts, strings, numbers, booleans, and None, not custom classes. You need to make a dictionary out of your People
instance. A simple way to do this is with vars(A)
.
Upvotes: 3