1. 程式人生 > 實用技巧 >Json模組

Json模組

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資料型別