[英]Serialize/Deserialize list of objects using json and python
如何將對象列表(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)
json
模塊需要列表,字符串,字符串,數字,布爾值和None,而不是自定義類。 您需要從People
實例中創建一個字典。 一種簡單的方法是使用vars(A)
。
您無法使用JSON序列化自定義類。
您應該使用pickle
模塊。 來自文檔:
https://docs.python.org/3/library/pickle.html#comparison-with-json
默認情況下,JSON只能表示Python內置類型的子集, 而不能表示自定義類 ;
強調我的。
另外,來自http://www.json.org/ :
JSON基於兩種結構:
- 名稱/值對的集合。 在各種語言中,這被實現為對象,記錄,結構, 字典 ,散列表,鍵控列表或關聯數組。
- 有序的值列表。 在大多數語言中,這被實現為數組,向量, 列表或序列。
再一次,重點是我的。 在python中,您可以序列化包含值的字典或列表,其中值可以是:
值可以是雙引號中的字符串,也可以是數字,或者true或false或null,或者是對象或數組。 這些結構可以嵌套。
將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'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.