Pyhon基礎知識之Json序列化與反序列化

  引言

  作接口測試的時候,我一般須要對返回的數據轉換成json格式的字符串,這樣一般使用到json庫,而json模塊四個方法:dump、dumps、load、loads。其中dump和load是操做文件,dumps和loads是操做python對象的。
html

  知識點

  前面說過python對象包括三個基本要素:惟一身份識別(id),類型(type)和值(value)。python

  而python3類型有6個標準的數據類型:json

  • Number(數字)
  • String(字符串)
  • List(列表)
  • Tuple(元組)
  • Set(集合)
  • Dictionary(字典)

  Python3 的六個標準數據類型中:學習

  • 不可變數據(3 個):Number(數字)、String(字符串)、Tuple(元組);
  • 可變數據(3 個):List(列表)、Dictionary(字典)、Set(集合)。

  序列化:json.dumps()將python對象轉化成json字符串

  

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

  

  反序列化:json.loads()將json字符串轉化python對象

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格式的字符串類型
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.dumps格式化輸出

  若是是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編碼。

如圖:

 

 

  五、skipkeys參數,在encoding過程當中,dict對象的key只能夠是string對象,若是是其餘類型,那麼在編碼過程當中就會拋出ValueError的異常。skipkeys能夠跳過那些非string對象看成key的處理。
 

  總結

  json序列化與反序列化的知識基本上就是這些,在之後作接口測試中會常常用到,其實在文章(接口實戰篇)裏我已經用到這些。打好基礎,之後會更駕輕就熟。

  另外,對測試開發,自動化測試,全棧測試相關技術感興趣的朋友,能夠加入到羣裏學習和探索交流,進羣方式,掃下方二維碼。

相關文章
相關標籤/搜索