在序列化中我们谈到,可以使用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>