所有入門單元免費開放 · 課程內容持續更新中

JSON:程式之間的共同語言

JSON 是程式之間交換資料最常用的格式。學會看懂它、用 Python 讀寫它,下一堂串接網路 API 就輕鬆了。

第 2.3 堂約 12 分鐘

為什麼要學 JSON?

上一堂的 CSV 很適合「一張表格」:每一列欄位都一樣。但真實世界的資料常常更複雜。例如一則天氣預報,有地點、有時間,還有「接下來 24 小時,每小時的溫度」這種一整串的資料。

這時就需要 JSON。它是一種用純文字表示資料的格式,幾乎所有程式語言都看得懂,所以成了程式之間交換資料的共同語言。你會在這些地方遇到它:

  • 網路 API 回傳的資料(下一堂的主角)
  • 程式的設定檔
  • 很多 AI 工具的設定和輸出

好消息是:如果你上過「Python 第一步」的串列與字典,你已經會一大半了。

JSON 長什麼樣子

{
  "name": "小美",
  "monthly_budget": 12000,
  "is_student": false,
  "categories": ["餐費", "交通", "娛樂"],
  "card": null
}

是不是很像 Python 的字典?大括號是物件(對應字典),中括號是陣列(對應串列)。但有幾個小地方不一樣:

對照表:JSON 的 object 對應 Python 的 dict,array 對應 list,true false 對應 True False,null 對應 None,JSON 字串只能用雙引號

JSON 和 Python 很像,但不完全一樣,注意大小寫和引號。

字串和 Python 互轉

Python 內建 json 模組,最常用的是這兩個:

import json

text = '{"item": "雞腿便當", "amount": 85, "paid": true}'
data = json.loads(text)
print(data["item"], data["paid"])

back = json.dumps(data, ensure_ascii=False)
print(back)
雞腿便當 True
{"item": "雞腿便當", "amount": 85, "paid": true}
  • json.loads():把 JSON 文字變成 Python 的字典或串列(s 代表 string)。
  • json.dumps():把 Python 資料變回 JSON 文字。

注意 true 變成了 True,再轉回去又變回 true,json 模組會幫你處理好。

ensure_ascii=False 是讓中文保持中文。不加的話,「雞腿便當」會變成一串像 雞 的編碼,雖然沒錯,但人看不懂。

讀寫 JSON 檔案

去掉 s 的 json.dump() 和 json.load(),是直接處理檔案:

import json

settings = {
    "monthly_budget": 12000,
    "categories": ["餐費", "交通", "娛樂"],
    "warn_at": 0.8,
}

with open("settings.json", "w", encoding="utf-8") as f:
    json.dump(settings, f, ensure_ascii=False, indent=2)

with open("settings.json", encoding="utf-8") as f:
    loaded = json.load(f)

print(loaded["categories"][0])
print(loaded["monthly_budget"] * loaded["warn_at"])
餐費
9600.0

indent=2 會讓檔案自動換行、縮排兩格,打開來很好讀。把預算這類「之後可能會改」的數字放在設定檔裡,就不用每次都去改程式碼。

一層一層往下拿

真實的 JSON 常常是字典裡有串列、串列裡又有字典。下面是一份簡化過的天氣資料,結構和下一堂會用的天氣 API 很像:

weather = {
    "latitude": 25.04,
    "longitude": 121.56,
    "hourly": {
        "time": ["2026-11-07T08:00", "2026-11-07T09:00", "2026-11-07T10:00"],
        "temperature_2m": [21.3, 22.1, 23.4],
    },
}

temps = weather["hourly"]["temperature_2m"]
print(temps[0])
print(max(temps))
21.3
23.4

巢狀結構示意圖:最外層字典裡有 latitude、longitude 和 hourly,hourly 是另一個字典,裡面的 time 和 temperature_2m 各是一個串列;取值路徑是 weather、hourly、temperature_2m、索引 0

拿值的訣竅是:從外往內,一層一層寫。先寫 weather["hourly"],print 出來確認是你要的,再往下加 ["temperature_2m"]。不要一次寫到底,出錯時很難找原因。

請 AI 幫你看懂一大坨 JSON

API 回傳的 JSON 有時很長,一眼看不出結構。這時可以請 AI 幫你畫出「地圖」。

可以這樣問 Claude

下面是一段 JSON 資料。請幫我:1)用縮排的樹狀清單畫出它的結構,標出每一層是物件還是陣列;2)告訴我在 Python 裡,要怎麼取出「第一個小時的溫度」,寫出完整的取值路徑。

(貼上 JSON)

行動練習
  1. 建立 settings.json,用 json.dump 寫入你的每月預算和常用類別,打開檔案看看 indent=2 的效果。
  2. 寫一支程式讀入 settings.json,印出「本月預算 12000 元,花到 9600 元時提醒你」這樣的句子(數字從設定檔來)。
  3. 故意在 settings.json 最後一項後面加一個逗號,再執行一次,讀讀看錯誤訊息怎麼告訴你錯在哪。
  4. 加分題:把上一堂的 expenses.csv 用 pandas 讀進來,再用 df.to_json("expenses.json", orient="records", force_ascii=False, indent=2) 存成 JSON,比較兩種格式的差別。

讀完了嗎?

標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。

卡住了?讓 AI 當你的家教複製這段提問範本,貼到 Claude 或其他 AI 工具,再補上你卡住的地方。

留言與討論

卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。

留言區即將開放。現在可以先到 GitHub 討論區 發問,或看看 交流頁 的其他管道。