今天是2016的最后一天,顺便整理了一下手头的资料,看到Flask中关于字符串处理当时踩得坑,反思的同时也对接口处理的序列化和反序列化有了较深的体会。
前期
我觉得我做事可能上手的确很快,比如当时写API
时,刚存入sqlite
中存入类型是以string
形式存入,以GET
接口展示时候,以return json.loads()
,其实对这样操作一直很懵懂,现在谈谈自己的理解:
当时,我需要以字符串形式存入,其实是序列化过程,把python的对象编码转换为json格式的字符串,而展示的时候,其实是反序列化过程,把json格式字符串解码为python数据对象。在python的标准库中,专门提供了json处理这部分。
先看看json的方法:
1 2 3 4 5 6
| #coding=utf-8 import json print dir(json) print json.__all__
|
输出内容:
1
| ['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']
|
进入正题
我们定义一个字典,通过json把它序列化为json格式的字符串,见实现的代码:
1 2 3 4 5 6 7 8 9
| #coding=utf-8 import json dict1={'name':'diaojunxian','age':22,'address':'xian'} print u'未序列化前的数据类型为:',type(dict1) print u'未序列化前的数据:',dict1 #对dict1进行序列化的处理 str1=json.dumps(dict1) print u'序列化后的数据类型为:',type(str1) print u'序列化后的数据为:',str1
|
输出内容:
1 2 3 4
| 未序列化前的数据类型为: <type 'dict'> 未序列化前的数据: {'age': 22, 'name': 'diaojunxian', 'address': 'xian'} 序列化后的数据类型为: <type 'str'> 序列化后的数据为: {"age": 22, "name": "diaojunxian", "address": "xian"}
|
通过如上的代码以及结果可以看到,这就是一个序列化的过程,简单的说就是把python的数据类型转换为json格式的字符串。下来我们再反序列化,把json格式的字符串解码为python的数据对象,见实现的代码和输出:
1 2 3 4
| #对str1反序列化 dict2=json.loads(str1) print u'反序列化后的数据类型:',type(dict2) print u'反序列化后的数据:',dict2
|
输出内容:
1 2
| 反序列化后的数据类型: <type 'dict'> 反序列化后的数据: {u'age': 22, u'name': u'diaojunxian', u'address': u'xian'}
|
中文处理
在编程过程还发现一个问题,在序列化时,中文汉字总是被转换为unicode码,在dumps函数中添加参数ensure_ascii=False即可解决。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #coding=utf-8 import json; #原始json数据 jsonData=[{'name':'刁俊先','age':30,'sex':'男'},{'name':'文静','age':20,'sex':'女'}]; #序列化,然后输出 jsonStr=json.dumps(jsonData,ensure_ascii=False); print("序列化结果:"); print(jsonStr); #再将jsonStr反序列化为json格式 jsonData=json.loads(jsonStr, strict=False); print("反序列化整体结果:"); print(jsonData); #然后接口返回为 print json.dumps(jsonData, ensure_ascii=False, indent=4)
|
输出内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 序列化结果: [{"age": 30, "name": "刁俊先", "sex": "男"}, {"age": 20, "name": "文静", "sex": "女"}] 反序列化整体结果: [{u'age': 30, u'name': u'\u5201\u4fca\u5148', u'sex': u'\u7537'}, {u'age': 20, u'name': u'\u6587\u9759', u'sex': u'\u5973'}] 然后接口返回为: [ { "age": 30, "name": "刁俊先", "sex": "男" }, { "age": 20, "name": "文静", "sex": "女" } ]
|