如何将对象列表(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)
答案 0 :(得分:3)
json
模块需要列表,字符串,字符串,数字,布尔值和无,而不是自定义类。您需要从People
实例中创建一个字典。一个简单的方法是使用vars(A)
。
答案 1 :(得分:2)
您无法使用JSON序列化自定义类。
您应该使用pickle
模块。来自文档:
https://docs.python.org/3/library/pickle.html#comparison-with-json
默认情况下,JSON只能代表Python内置的子集 类型,,没有自定义类;
强调我的。
此外,来自http://www.json.org/:
JSON基于两种结构:
- 名称/值对的集合。在各种语言中,这被实现为对象,记录,结构,字典,哈希表,键控 列表或关联数组。
- 有序的值列表。在大多数语言中,这被实现为数组,向量,列表或序列。
同样,重点是我的。在python中,您可以序列化包含值的字典或列表,其中值可以是:
值可以是双引号中的字符串,也可以是数字,或者是真或 false或null,或对象或数组。这些结构可以 嵌套。
答案 2 :(得分:2)
将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'])