序列化是把内存里的变量,变成可存储或者可传输到其他模块、设备的过程。web应用最常见的序列化后的标准格式有JSON,XML等。PYTHON内置的json模块对序列化、反序列化提供了完备的功能。
常用接口函数:
json.dump() 把对象序列化,写入类似文件的流
json.dumps() 注意函数名的区别,把对象序列化成json格式的字符串,这个函数比较常用
对应的反序列化的函数:
json.load()
json.loads()
举个例子:
在默认情况下,JSON和python类型之间的对应关系如下:>>> import json >>> d = dict(name='Alice', age=20, score=90) >>> json.dumps(d) '{"age": 20, "name": "Alice", "score":90
}'
JSON | Python |
object | dict |
array | list |
string | unicode |
number | int, log |
number(real) | float |
true/false | True/False |
null | None |
进阶 - 转换类对象
不能直接转换class对象,解决方案是提供一个自定义的转换函数,这个函数负责把类变量转换成dict格式,并作为dumps()的参数,这个在廖雪峰的教程里有详细的介绍,大家可以自行搜索。简单的举例示范如下:
>>> import json >>> d = MyClass('Alice',20, 90) >>> json.dumps(d,object_hook=
myfunc)
重名对象的处理
json规定每个对象的名字必须是唯一的,如果JSON对象有重名时,json模块不产生异常,而是自动取最后一对。
>>> import json >>> d ='{"x":1, "x":2, "x":3}' >>> json.loads(d
) >>> {u'x':3}
中文编码问题
开发web应用时,由于页面使用中文,所以常常需要返回中文信息。可以默认情况下,序列化时使用unicode编码,解决这个问题的方案是添加dumps的参数: ensure_ascii=False。