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

时间:2016-06-11 00:03:39

标签: python json serialization

如何将对象列表(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)

3 个答案:

答案 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'])