1、序列化需求

假如有一个其它语言编写很大的字典,通过网络传输协作开发,使用前需要转换成字典。

dic = {'name': 'lin', 'age': 25, 'sex': '男'}
ret = str(dic).encode('utf-8')                            # 传输过来之后是byte类型

ret1 = ret.decode('utf-8')
print(ret1, type(ret1))                                   # 通过此方法,只能取到字符串类型,可以使用eval()方法,但是不建议。

----------------------执行结果-------------------------
{'name': 'lin', 'age': 25, 'sex': '男'} <class 'str'>
------------------------------------------------------

2、使用json模块,适用于所有语言,dumps和loads主要用于网络传输;将重要的数据变成可以传输的,并且得到后能够反解出来。

import json
dic = {'name': 'lin', 'age': 25, 'sex': '男'}
ret = json.dumps(dic)
print(ret, type(ret))

----------------------执行结果-------------------------
{"name": "lin", "age": 25, "sex": "\u7537"} <class 'str'>   # 序列化就是变成一个特殊的字符串
------------------------------------------------------

ret = json.dumps(dic, ensure_ascii=False)                   # 设置ensure_ascii
print(ret, type(ret))
----------------------执行结果-------------------------
{"name": "lin", "age": 25, "sex": "男"} <class 'str'>
------------------------------------------------------

respon = json.loads(ret)                                    # 使用loads进行反序列化,反解成原来的类型
print(respon, type(respon))
print(respon.get('name'))
----------------------执行结果-------------------------
{'name': 'lin', 'age': 25, 'sex': '男'} <class 'dict'>
lin
------------------------------------------------------

3、dump和load用于写入文件操作

dic = {'Request_Server_Name': 'www.abc.com', 'Request_Server_Host': '1.1.1.1', 'Request_Server_Port': '443',
        'Forward_Real_WebServer': '10.10.10.1', 'Request_Real_Client': '2.2.2.2', 'Requests_number': 1,
        'Request_Size': 1024, 'Requst_Return_Status_Code': 200, 'Request_Mothod': 'GET /'
       }

with open('access.log', 'w') as f:
    json.dump(dic, f)                                        # dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件

------------------------------------------------------
with open('access.log', mode='r') as f:
    dic2 = json.load(f)                                      # load方法读取文件句柄,直接将文件中的json字符串转换成数据结构返回
    print(type(dic2))
    print(dic2.get('Request_Size'))
----------------------执行结果-------------------------
<class 'dict'> 1024
------------------------------------------------------