Python 資料持久化 - JSON 模組



JSON 代表 **JavaScript 物件表示法 (JavaScript Object Notation)**。它是一種輕量級的資料交換格式。它是一種與語言無關且跨平臺的文字格式,許多程式語言都支援它。此格式用於 Web 伺服器和客戶端之間的資料交換。

JSON 格式類似於 pickle。但是,pickle 序列化是 Python 特定的,而 JSON 格式由多種語言實現,因此已成為通用標準。Python 標準庫中 json 模組的功能和介面類似於 pickle 和 marshal 模組。

與 pickle 模組一樣,json 模組也提供 **dumps()** 和 **loads()** 函式,用於將 Python 物件序列化為 JSON 編碼的字串,以及 **dump()** 和 **load()** 函式,用於將序列化後的 Python 物件寫入檔案或從檔案中讀取。

  • **dumps()** − 此函式將物件轉換為 JSON 格式。

  • **loads()** − 此函式將 JSON 字串轉換回 Python 物件。

以下示例演示了這些函式的基本用法:

import json
   data=['Rakesh',{'marks':(50,60,70)}]
   s=json.dumps(data)
json.loads(s)

dumps() 函式可以採用可選的 sort_keys 引數。預設情況下,它是 False。如果設定為 True,則字典鍵將按排序順序出現在 JSON 字串中。

dumps() 函式還有一個可選引數,稱為 indent,它採用數字作為值。它決定 JSON 字串格式化表示的每個段的長度,類似於列印輸出。

json 模組還具有與上述函式相對應的面向物件 API。模組中定義了兩個類 - JSONEncoder 和 JSONDecoder。

JSONEncoder 類

此類的物件是 Python 資料結構的編碼器。每個 Python 資料型別都轉換為對應的 JSON 型別,如下表所示:

Python JSON
字典 物件
列表,元組 陣列
字串 字串
整數,浮點數,整數和浮點派生列舉 數字
True true
False false
None null

JSONEncoder 類由 JSONEncoder() 建構函式例項化。編碼器類中定義了以下重要方法:

序號 方法和描述
1

encode()

將 Python 物件序列化為 JSON 格式

2

iterencode()

編碼物件並返回一個迭代器,該迭代器生成物件中每個專案的編碼形式。

3

indent

確定編碼字串的縮排級別

4

sort_keys

為 true 或 false,使鍵按排序順序出現或不出現。

5

check_circular

如果為 True,則檢查容器型別物件中的迴圈引用

以下示例對 Python 列表物件進行編碼。

e=json.JSONEncoder()
e.encode(data)

JSONDecoder 類

此類的物件有助於將 JSON 字串解碼回 Python 資料結構。此類中的主要方法是 decode()。以下示例程式碼從前面步驟中的編碼字串中檢索 Python 列表物件。

d=json.JSONDecoder()
d.decode(s)

json 模組定義了 **load()** 和 **dump()** 函式,用於將 JSON 資料寫入檔案類物件(可能是磁碟檔案或位元組流)並從中讀取資料。

dump()

此函式將 JSON 編碼的 Python 物件資料寫入檔案。該檔案必須以 'w' 模式開啟。

import json
data=['Rakesh', {'marks': (50, 60, 70)}]
   fp=open('json.txt','w')
   json.dump(data,fp)
   fp.close()

此程式碼將在當前目錄中建立 'json.txt'。它顯示內容如下:

["Rakesh", {"marks": [50, 60, 70]}]

load()

此函式從檔案中載入 JSON 資料並返回其中的 Python 物件。該檔案必須以讀取許可權開啟(應具有 'r' 模式)。

示例

fp=open('json.txt','r')
   ret=json.load(fp)
   print (ret)
   fp.close()

輸出

['Rakesh', {'marks': [50, 60, 70]}]

**json.tool** 模組還具有一個命令列介面,該介面驗證檔案中的資料並以漂亮的格式化方式列印 JSON 物件。

C:\python37>python -m json.tool json.txt
[
   "Rakesh",   
   {
      "marks": [
         50,
         60,
         70
      ]
   }
]
廣告