2.28. JSON

JSON(JavaScript Object Notation)是一種精簡、人類可讀的結構化資料文字格式。它定義了六種型別 -- stringnumberbooleannullarrayobject -- 每一種都直接對應到一個 Python 值,因此在 Python 與 JSON 之間的轉換,無論哪個方向都只需呼叫一個函式。

JSON 是設定檔與 Web API 的通用語言。每當你需要把一小組設定以同時也能用肉眼閱讀的形式儲存到磁碟,或要與另一個程式交換結構化資料時,都可以採用它。

兩個函式就能涵蓋大多數的需求:

  • json.dumps() -- dump string:把一個 Python 值轉成 JSON 字串。

  • json.loads() -- load string:把一個 JSON 字串解析回 Python。

json.dump / json.load(沒有 s)這一組做的是同樣的工作,但直接接受一個檔案物件。

2.28.1. 編碼(dumps)

import json

config = {
    "name":  "OpenMV",
    "width": 320,
    "tags":  ["red", "round"],
}

text = json.dumps(config)
print(text)

輸出:

{"name": "OpenMV", "width": 320, "tags": ["red", "round"]}

對應關係為:

超出這個集合的任何東西(自訂類別、bytes 緩衝區、set)都會引發 TypeError。請先轉換該值。

備註

CPython 的 json.dumps() 接受一個 indent 引數以產生美化排版的輸出;MicroPython 的則不接受。唯一的格式化旋鈕是 separators,它控制行內的間距 -- 傳入 (',', ':') 可得到最精簡的形式。如有需要,多行、帶縮排的輸出必須以手動方式產生。

2.28.2. 解碼(loads)

text = '{"name": "OpenMV", "width": 320}'
config = json.loads(text)
print(config["name"], config["width"])

輸出:

OpenMV 320

JSON object 會變成 dict,array 會變成 list,其餘的則對應回它們的 Python 等價物。不良的 JSON 會引發 ValueError

2.28.3. 讀取與寫入檔案

以檔案為基礎的這一組與 with 配合得很好:

import json

with open("config.json") as f:
    config = json.load(f)

config["width"] = 640

with open("config.json", "w") as f:
    json.dump(config, f)

請把 JSON 檔當成一筆完整的紀錄來處理 -- 讀進來、修改 Python 值、再寫回去。試圖在檔案內就地編輯 JSON,通常製造的錯誤會比省下的還多。