作接口測試的時候,我一般須要對返回的數據轉換成json格式的字符串,這樣一般使用到json庫,而json模塊四個方法:dump、dumps、load、loads。其中dump和load是操做文件,dumps和loads是操做python對象的。
html
前面說過python對象包括三個基本要素:惟一身份識別(id),類型(type)和值(value)。python
而python3類型有6個標準的數據類型:json
Python3 的六個標準數據類型中:學習
import json a = {'a':1,'b':2} to_json = json.dumps(a,indent=True) print(to_json) print(type(to_json))
運行結果:測試
{ "a": 1, "b": 2 } <class 'str'> Process finished with exit code 0
import json a = {'a':1,'b':2} to_json = json.dumps(a,indent=True) print(to_json) print(type(to_json)) to_str = json.loads(to_json) print(to_str) print(type(to_str))
運行結果:編碼
{ "a": 1, "b": 2 } <class 'str'> {'a': 1, 'b': 2} <class 'dict'> Process finished with exit code 0
'''json的序列化與反序列化 json格式的字符串類型 json序列化:把python的數據類型轉換爲json的字符串 json反序列化:把json的字符串轉換爲python的數據類型 ''' '''字典的序列化與反序列化''' # 字典的序列化 import json dict1 = {'name': 'AI', 'age': 18, 'address': 'beijing'} # 注意:字典類型中,鍵值都是單引號,而json格式,是雙引號 new = json.dumps(dict1) print(new, type(new)) # 運行結果以下: # {"name": "AI", "age": 18, "address": "beijing"} <class 'str'> # 字典的反序列化 newdict = json.loads(new) print(newdict, type(newdict)) # 運行結果以下: # {'name': 'AI', 'age': 18, 'address': 'beijing'} <class 'dict'> '''列表的序列化與反序列化''' # 列表的序列化 list1 = ["aa", "bb", "cc"] list_str = json.dumps(list1) print(list_str, type(list_str)) # 運行結果以下: # ["aa", "bb", "cc"] <class 'str'> # 列表的反序列化 newlist = json.loads(list_str) print(newlist, type(newlist)) # 運行結果以下: # ['aa', 'bb', 'cc'] <class 'list'> '''元組的序列化與反序列化''' # 元組的序列化 tuple1 = ("aaa", "bbb", "ccc") tuple_str = json.dumps(tuple1) print(tuple_str, type(tuple_str)) # 運行結果以下: # ["aaa", "bbb", "ccc"] <class 'str'> # 元組的反序列化 newtuple = json.loads(tuple_str) print(newtuple, type(newtuple)) # 運行結果以下: # ['aaa', 'bbb', 'ccc'] <class 'list'> # 此處須要注意:元組的反序列化結果類型是列表,而非元組 '''文件的序列化與反序列化: 此過程也可理解爲,文件序列化是把內容寫進json文件中,讀取的時候進行反序列化''' import json accounts={10: {'name': 'AI', 'age': 18, 'address': 'beijing'}} # 原始數據 def json_file(): with open('info.json', 'w') as f1: f1.write(json.dumps(accounts)) # 寫入時對文件進行序列化 with open('info.json', 'r') as f2: type_json = json.load(f2) # 讀取時對文件進行反序列化 print("反序列化後的內容:", type_json, "類型:", type(type_json)) type_json['sex'] = 'boy' # 對文件內容進行更改 json.dump(type_json, open('info.json', 'w')) # 修改後的內容寫入到json格式的文件中 if __name__ == '__main__': json_file() # 查看json文件內容顯示以下: # {"10": {"name": "AI", "age": 18, "address": "beijing"}, "sex": "boy"}
運行結果url
{"name": "AI", "age": 18, "address": "beijing"} <class 'str'> {'name': 'AI', 'age': 18, 'address': 'beijing'} <class 'dict'> ["aa", "bb", "cc"] <class 'str'> ['aa', 'bb', 'cc'] <class 'list'> ["aaa", "bbb", "ccc"] <class 'str'> ['aaa', 'bbb', 'ccc'] <class 'list'> 反序列化後的內容: {'10': {'name': 'AI', 'age': 18, 'address': 'beijing'}} 類型: <class 'dict'> Process finished with exit code 0
若是是json格式的數據,打印出來就是一行,顯然不雅觀,若是想美化一下,能夠這樣:spa
data={ "msgBody":{ "data": { "imgType": "", "imgURL": "image url", "imgLike": 0.5 } }, "msgHead":{ "Token": "", "Code": "", "rmsg": "hello", } } data = json.dumps(data, sort_keys=True, indent=4, separators=(', ',': ')) print(data)
輸出結果:code
參數解析:htm
一、sort_keys是告訴編碼器按照字典key排序(a到z)輸出。
二、indent參數根據數據格式縮進顯示,讀起來更加清晰, indent的值,表明縮進空格式:
三、separators參數的做用是去掉‘,’ ‘:’後面的空格,在傳輸數據的過程當中,越精簡越好,冗餘的東西所有去掉。
四、輸出真正的中文須要指定ensure_ascii=False,若是無任何配置,或者說使用默認配置,輸出的會是‘涼涼’的ASCII字符嗎,而不是真正的中文。這是由於json.dumps 序列化時對中文默認使用的ascii編碼。
如圖:
json序列化與反序列化的知識基本上就是這些,在之後作接口測試中會常常用到,其實在文章(接口實戰篇)裏我已經用到這些。打好基礎,之後會更駕輕就熟。
另外,對測試開發,自動化測試,全棧測試相關技術感興趣的朋友,能夠加入到羣裏學習和探索交流,進羣方式,掃下方二維碼。