第 10 課 · 入門 · 18 分鐘

Python JSON 入門

把 JSON 文字變成 Python 值,讀取巢狀記錄,再把資料寫回 JSON。

loads 與 dumps巢狀尋找走訪記錄

姑媽要的是當天的數字,不是一張截圖。JSON 把 Python 字典變成另一段程式也能讀回來的文字。這一來一回,什麼留了下來,什麼又悄悄換了型別?

JSON 是一種結構化文字格式,API 和設定檔案經常使用它。Python 的 json 模組可以在 JSON 文字與字典、列表、字串、數字、布林值和 None 之間轉換。 你還會在索引前驗證解碼後的 JSON,並生成穩定輸出。

解析與序列化

json.loads(text) 把 JSON 字串解析成 Python 值。json.dumps(value) 把 Python 值轉成 JSON 文字。loads 和 dumps 末尾的 s 表示字串;load 和 dump 用於檔案物件。

import json
raw = '{"drink": "拿鐵", "price": 4.5}'
data = json.loads(raw)
print(data["drink"])
print(json.dumps(data))

文字與 Python 值互轉

讀取巢狀資料

JSON 物件會變成字典,JSON 陣列會變成列表。連續使用鍵和索引就能到達巢狀值。需要匯總每條記錄時,走訪記錄列表。

import json
raw = '{"items": [{"name": "拿鐵"}, {"name": "茶"}]}'
data = json.loads(raw)
for item in data["items"]:
    print(item["name"])

巢狀記錄

讓輸出更易讀

json.dumps 可以接收 indent 進行美化,sort_keys 可以穩定鍵的順序。這些選項適合設定檔案和偵錯,不會改變底層值。

import json
data = {"b": 2, "a": 1}
print(json.dumps(data, indent=2, sort_keys=True))

可讀的 JSON

索引前先驗證結構

json.loads() 只驗證 JSON 語法,不驗證你的 schema。解碼結果可能是列表而不是字典,欄位也可能缺失。先檢查容器型別,再逐層檢查鍵,最後才索引。

import json
raw = '{"order": {"items": [{"name": "latte", "qty": 2}]}}'
data = json.loads(raw)
order = data.get("order", {})
items = order.get("items", [])
print(isinstance(items, list), len(items))
if items and isinstance(items[0], dict):
    print(items[0].get("name", "unknown"))

語法正確不等於結構正確

讓 JSON 輸出保持穩定

sort_keys=True 讓輸出在不同執行之間保持穩定,indent=2 讓內容可讀。給機器用緊湊輸出,給日誌或教學用縮進輸出;需要保留中文等非英文字元時,用 ensure_ascii=False。

import json
payload = {"total": 12.0, "items": ["latte", "tea"], "note": "café"}
print(json.dumps(payload, sort_keys=True))
print(json.dumps(payload, indent=2, sort_keys=True, ensure_ascii=False))

穩定的鍵順序與可讀的 Unicode

JSON 不是 Python

JSON 只有物件、陣列、字串、數字、布林值和 null。Python 元組會變成陣列,整數鍵會變成字串,None 會變成 null。因此往返一次不一定保留原來的 Python 型別。用 sort_keys=True 讓輸出穩定;需要直接閱讀非 ASCII 文字時,用 ensure_ascii=False。

import json

payload = {"count": 2, "tags": ("tea", "latte"), "note": None}
text = json.dumps(payload, sort_keys=True)
print(text)
print(json.loads(text))

元組變成了陣列

本課要點

  • json.loads 解析字串,json.dumps 序列化為字串。
  • JSON 物件對應字典,JSON 陣列對應列表。
  • 用連續的鍵和索引讀取巢狀值。
  • indent 和 sort_keys 讓 JSON 更容易檢查。
  • JSON 語法合法不代表結構符合預期。
  • JSON 的型別比 Python 少;往返轉換可能改變容器型別。

常見錯誤

  • 對字串呼叫 json.load,而不是 json.loads。
  • 在 JSON 文字裡使用單引號;JSON 字串必須使用雙引號。
  • 忘記 JSON 的 null 會變成 Python 的 None。
  • 解碼後不檢查型別就直接索引。
  • 以為元組或整數鍵經過 json.dumps() 和 json.loads() 後還是原型別。
輪到你

解析一個包含 items 列表的 JSON 物件,對數字求和並列印總數。

動手試試

改改變數、先預測輸出,再執行程式碼。第一次點擊「執行程式碼」時會下載 Python 執行時,可能需要幾秒鐘。

瀏覽器內 Python本機執行 · 無需帳號
首次執行會從 CDN 下載 Pyodide。修改後點擊「執行程式碼」。

練習本課

12 道題,作答後立即看到解釋。

查看 12 道題答案開始練習
← 錯誤處理while 迴圈 →