JSON:程式之間的共同語言
JSON 是程式之間交換資料最常用的格式。學會看懂它、用 Python 讀寫它,下一堂串接網路 API 就輕鬆了。
為什麼要學 JSON?
上一堂的 CSV 很適合「一張表格」:每一列欄位都一樣。但真實世界的資料常常更複雜。例如一則天氣預報,有地點、有時間,還有「接下來 24 小時,每小時的溫度」這種一整串的資料。
這時就需要 JSON。它是一種用純文字表示資料的格式,幾乎所有程式語言都看得懂,所以成了程式之間交換資料的共同語言。你會在這些地方遇到它:
- 網路 API 回傳的資料(下一堂的主角)
- 程式的設定檔
- 很多 AI 工具的設定和輸出
好消息是:如果你上過「Python 第一步」的串列與字典,你已經會一大半了。
JSON 長什麼樣子
{
"name": "小美",
"monthly_budget": 12000,
"is_student": false,
"categories": ["餐費", "交通", "娛樂"],
"card": null
}
是不是很像 Python 的字典?大括號是物件(對應字典),中括號是陣列(對應串列)。但有幾個小地方不一樣:
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
拿值的訣竅是:從外往內,一層一層寫。先寫 weather["hourly"],print 出來確認是你要的,再往下加 ["temperature_2m"]。不要一次寫到底,出錯時很難找原因。
請 AI 幫你看懂一大坨 JSON
API 回傳的 JSON 有時很長,一眼看不出結構。這時可以請 AI 幫你畫出「地圖」。
下面是一段 JSON 資料。請幫我:1)用縮排的樹狀清單畫出它的結構,標出每一層是物件還是陣列;2)告訴我在 Python 裡,要怎麼取出「第一個小時的溫度」,寫出完整的取值路徑。
(貼上 JSON)
- 建立
settings.json,用json.dump寫入你的每月預算和常用類別,打開檔案看看indent=2的效果。 - 寫一支程式讀入
settings.json,印出「本月預算 12000 元,花到 9600 元時提醒你」這樣的句子(數字從設定檔來)。 - 故意在
settings.json最後一項後面加一個逗號,再執行一次,讀讀看錯誤訊息怎麼告訴你錯在哪。 - 加分題:把上一堂的
expenses.csv用 pandas 讀進來,再用df.to_json("expenses.json", orient="records", force_ascii=False, indent=2)存成 JSON,比較兩種格式的差別。
讀完了嗎?
標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。
留言與討論
卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。