json与序列化pickling

来源:互联网 发布:编程怎么写主程序 编辑:程序博客网 时间:2024/05/22 09:00

JSON:表示出来就是字符串

JSON类型Python类型{}dict[]list"string"str1234.56int或floattrue/falseTrue/FalsenullNone

使用json.dumps(dict)返回一个字符串

json.loads(str)将字符串转化成dict


Python的dict对象可以直接序列化为JSON的{},不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import json
 
class Student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
    def student2dict(std):
        return {
        'name': std.name,
        'age': std.age,
        'score': std.score
        }
    def dict2student(d):
        return Student(d['name'], d['age'], d['score'])
 
 
if __name__ == '__main__':
    = Student('Bob'2088)
    print(json.dumps(s, default=Student.student2dict))   #输出的是字符串类型
    json_str = '{"age": 20, "score": 88, "name": "Bob"}'
    print(Student.student2dict(json.loads(json_str, object_hook=Student.dict2student)))  #输出的是dict类型


别急,我们仔细看看dumps()方法的参数列表,可以发现,除了第一个必须的obj参数外,dumps()方法还提供了一大堆的可选参数:

https://docs.python.org/3/library/json.html#json.dumps

这些可选参数就是让我们来定制JSON序列化。前面的代码之所以无法把Student类实例序列化为JSON,是因为默认情况下,dumps()方法不知道如何将Student实例变为一个JSON的{}对象。可选参数关键字default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student专门写一个转换函数,再把函数传进去即可:所以我们在类中定义了方法student2dict来完成这个操作。

同样的道理,如果我们要把JSON反序列化为一个Student对象实例,loads()方法首先转换出一个dict对象,然后,我们传入关键字object_hook函数负责把dict转换为Student实例:函数dict2student就是完成这样一个功能。

json也有dump和load函数,用法同pickling,下面会讲到


pickling:

pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。或者用另一个方法pickle.dump()直接把对象序列化后写入一个文件:

1
2
3
>>> f = open('dump.txt''wb')
>>> pickle.dump(d, f)
>>> f.close()


看看写入的dump.txt文件,一堆乱七八糟的内容,这些都是Python保存的对象内部信息。

当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。我们打开另一个Python命令行来反序列化刚才保存的对象:

1
2
3
4
5
>>> f = open('dump.txt''rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
{'age'20'score'88'name''Bob'}