Json模組
阿新 • • 發佈:2020-08-04
json:全稱JavaScript Object Notation,是一種java指令碼兌現標記語言,已經成為一種簡單的資料交換格式,通常用於序列化和反序列化工作。
一、json的dumps方法與loads方法
作用:主要操作記憶體中的資料
1.json.dumps(資料):將資料轉換成json字串
2.json.loads(json字串):將json字串轉換為原來的資料
二、json的dump方法與load方法
作用:常組合使用於檔案操作中
開啟某一檔案後-->1.json.dump(資料, 檔案) 將資料先轉換成json字串再寫入檔案
2.json.load(檔案) 將檔案中的json字串讀取出來並轉換為原來的資料
缺點:json操作檔案通常是一次性寫,一次性讀。即在你開啟某一檔案到檔案關閉之前,你只能寫入一次或者讀取一次
三、序列化:serialization
將記憶體中的資料,轉換成位元組串 ,用以儲存在檔案或通過網路傳輸
import json # json.dumps() 把指定的物件轉換成json格式的字串並返回 s = json.dumps([1, 2, 3]) print(s, type(s)) # '[1, 2, 3]' s1 = json.dumps((1, 2, 3)) # 元組序列化後,其形式會變成列表 print(s1, type(s1)) s2 = json.dumps(10)print(s2, type(s2)) s3 = json.dumps({'name':'David', 'age':20}) print(s3, type(s3)) # 可以將某一資料物件寫到檔案中 # with open('b.txt', encoding='utf-8', mode='a') as f: # json.dump([1, 2, 3, 4], f)
四、反序列化:deserialization
從檔案、網路中獲取的資料,替換為記憶體中原來的資料型別
import json res = json.dumps(100) # 把100變為json字串 num = json.loads(res) #原來資料型別 print(num, type(num)) # 從檔案中反序列化 with open('b.txt', encoding='utf-8') as f: res = json.load(f) print(type(res)) print(res)
五、如何解決dump方法與load方法在檔案操作中的缺點
思路:把需要序列化的資料物件,通過多次序列化的方式(可以理解為將物件拆分成多個小塊),再用檔案操作的write方法,將多次序列化之後的json字串依次全部寫入檔案
1.多次序列化後寫入檔案
with open('json.txt', encoding='utf-8', mode='a') as f: f.write(json.dumps([1, 2]) + '\n') f.write(json.dumps([3 ,4, 5]) + '\n')
2.把分次序列化的json字串,從檔案中反序列化回來
with open('json.txt', encoding='utf-8', mode='rt') as f: for line in f: print(json.loads(line.strip()))
六、補充一些小知識點
l1 = [i for i in range(5)] # l1 --> bytes # b1 = l1.encode('utf-8') # 不能直接轉換 # 只有字串才能和bytes相互轉換 # 先轉換成字串再轉換成bytes b1 = str(l1).encode('utf-8') print(b1, type(b1)) # 假如接收方接收到了 b1 # 需要先以相應的編碼格式對b1進行解碼 s2 = b1.decode('utf-8') print(s2, type(s2)) dic = {'name':'lgq', 'age':22, 'stats':True} import json # 將dic轉換成特殊的字串 s3 = json.dumps(dic, ensure_ascii=False) print(s3, type(s3)) # 再轉換回去 dic1 = json.loads(s3) print(dic1, type(dic1))
七、小結
json主要用於序列化和反序列化
缺點:不安全;不適用於set資料型別