在序列化中我们谈到,可以使用pickle进行序列化。但是,pickle模块不能存储关键数据。这时,可以使用xml,json的数据格式存储比较重要的数据。与xml格式相比,json格式更简单,更快,还能在界面中读取。

json表示的就是javascript语言的对象,其与python中的对象有着如下的对应关系:

json python
{} dict
[] list
“string” str
12356.789 int float
true/false True\False
null None

python 对象 —–> json

利用python的json模块,可以将python对象转化为json格式。
>>> import json
>>> d = dict(name = ‘wava’, age = 20, score =88)
>>> json.dumps(d)
‘{“age”: 20, “score”: 88, “name”: “wava”}’
dumps()函数返回一个字符串,内容就是标准的json。
与pickle模块类似,json模块也有dump()函数。输入一个python对象,并将这个对象写入文件,其格式是符合json标准的。
我们先换个工作路径:
>>> os.path.abspath(‘.’)
‘C:\Python27’
>>> os.chdir(‘../pyPro’)
>>> os.getcwd()
‘C:\pyPro’
>>> f = open(‘test.txt’,’wb’)
>>> json.dump(d,f)
>>> f.close()
这样,test.txt文件中就存储了字符串{“age”: 20, “score”: 88, “name”: “wava”}

json —> python对象

要把json反序列化为python对象可以使用loads和load方法。
loads的输入参数是字符串对象。
load的输入参数是文件对象。
>>> os.listdir(‘.’)
[‘.ipynb_checkpoints’, ‘dump.txt’, ‘pickle.py’, ‘test.txt’]
>>> f = open(‘test.txt’,’rb’)
>>> d = json.load(f)
>>> d
{u’age’: 20, u’score’: 88, u’name’: u’wava’}
>>> d_js = json.dumps(d)
>>> d_js
‘{“age”: 20, “score”: 88, “name”: “wava”}’
>>> d = json.loads(d_js)
>>> d
{u’age’: 20, u’score’: 88, u’name’: u’wava’}

python的一般类——–>json

平时中,我们使用最多的是自己写的类。这些类如何转变为json数据呢?
这需要我们自己写个转化函数。

class Student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
def student2dict(std):
    return dict(name=std.name,age = std.age,score=std.score)

>>> s = Student(‘wat’,20,66)
>>> json.dumps(s, default=student2dict)
‘{“age”: 20, “score”: 66, “name”: “wat”}’
在python语言中,类的实例都有一个__dict__属性,这是一个字典,它里面存放着这个实例的属性,少数例外是类中定义了__slots__属性。
>>> s.__dict__
{‘age’: 20, ‘score’: 66, ‘name’: ‘wat’}
>>> json.dumps(s,default=lambda x:x.__dict__)
‘{“age”: 20, “score”: 66, “name”: “wat”}’

json——–>python一般类

在反序列化时,dumps函数提供了参数object_hook,将dict转化为类的实例。
|>>> d_js
‘{“age”: 20, “score”: 88, “name”: “wava”}’

def dict2student(d):
    return Student(d['name'],d['age'],d['score'])

>>> ls = json.loads(d_js, object_hook=dict2student)
>>> ls
<__main__.Student object at 0x0000000002C720B8>