簡體   English   中英

使用json和python序列化/反序列化對象列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM