API(Application Programming Interface,應用程式介面)是一種軟體介面,定義了不同軟體系統之間如何互動的規則和工具。它就像一份「約定」,告訴你的程式(Client)如何向服務端(Server)發出請求,並規定服務端要如何把格式正確的資料回傳給程式。API 並不是資料庫、伺服器或某個軟體產品本身,而是雙方溝通的規則和門面。
簡單來說,API 是一套讓兩個程式互相「講話」的語言規則。舉例來說,當手機 App 想取得天氣資訊時,它會透過 API 向氣象服務說:「請給我今天的天氣」,服務端再用 API 規定好的格式把天氣資料回傳給 App。這樣,App 就不需要知道氣象服務內部的運作細節,只要按照約定好的規則溝通,就能拿到需要的資料。
對程式設計師來說,API 是軟體整合和系統溝通的橋樑。它是一套標準化的接口說明,程式設計師可以透過 API 提供的方法來呼叫服務或取得資料,幫助他們快速且安全地開發能與其他系統整合的應用程式。
Client(客戶端)和 Server(伺服器)是網路架構中兩個基本的角色。Server 是提供資源或服務的電腦,而 Client 則是向 Server 發送請求並接收回應的裝置或應用程式。
API 在日常生活中廣泛存在,特別是手機 App 和網站的背後都仰賴 API 來溝通數據和服務。例如天氣 App 會透過 API 抓取氣象資料,電子商務網站透過 API 處理支付功能,社群媒體平台也用 API 讓不同裝置可以互動。
API 最大特色是標準化、封裝系統細節,讓開發者專注在使用已提供的服務而無需了解內部複雜實作。API 透過明確的介面,實現應用程式間的模組化整合,提升開發效率與擴充性。
常見 API 資料格式包括:
接下來會接著介紹JSON 是什麼、基本格式與常見資料型別。
JSON(JavaScript Object Notation)是一種純文字、輕量級的資料交換格式,用來儲存和傳送結構化資料。它格式簡潔,人容易閱讀,程式也能輕鬆解析和處理。
一般文字檔只是純文字,沒有規則或結構,程式無法直接理解其內容的意義。而 JSON 有明確的語法規則和結構,能清楚地描述資料,使程式能正確解析和使用,且比其他標記語言(如 XML)更輕巧。
JSON 主要用兩種符號來組織資料:
{}
:一組由鍵(key)和值(value)組成的資料集合,表示無序的「屬性清單」。[]
:一組有順序的資料列表。{}
用來表示有名稱的屬性集合,例如一個人的姓名、年齡等資料鍵值對。{
"name": "John",
"age": 30
}
[]
表示有順序的資料集合,例如多筆水果名稱或數字列表。["apple", "banana", "cherry"]
hello
"100
、3.14
true
或 false
{}
表示的鍵值集合[]
表示的資料列表總結,JSON 是格式清晰且易於人讀、程式解析的純文字資料格式,透過物件和陣列組織多種基本資料型別,使資料交換更簡單有效率。
在了解 API 與 JSON 之後,撰寫一個小範例來讀取 JSON 字典。
mkdir day02
cd day02
{
"name": "王小明",
"age": 20,
"student": true,
"email": "ming@example.com",
"hobbies": ["coding", "basketball", "music"],
"scores": { "math": 92, "english": 85, "science": 88 },
"address": {
"city": "Taipei",
"zip": "100"
},
"note": null
}
(小提醒:所有字串與 key 都用雙引號,最後一個元素不要加逗號)
python -m json.tool .\data.json
{
"name": "\u738b\u5c0f\u660e",
"age": 20,
"student": true,
"email": "ming@example.com",
"hobbies": [
"coding",
"basketball",
"music"
],
"scores": {
"math": 92,
"english": 85,
"science": 88
},
"address": {
"city": "Taipei",
"zip": "100"
},
"note": null
}
看到 \uXXXX 是正常的(ASCII 顯示方式,不是亂碼)。
3.建立 Python 範例:讀取與取值
import json #叫進 Python 內建的 JSON 工具箱,用來把 JSON ⇄ Python 物件互轉
from pathlib import Path #引入 Path 物件
def load_json(path: str): #定義一個函式,負責「從路徑讀 JSON」
with open(path, "r", encoding="utf-8") as f: #用讀取模式打開檔案,指定 UTF-8
return json.load(f) # 讀檔字串 -> Python 物件(dict/list)
def pretty_print(obj): #定義一個「美化輸出」的小工具
print(json.dumps(obj, ensure_ascii=False, indent=2, sort_keys=True))
#把 Python 物件轉回 JSON 字串再印出
#ensure_ascii=False:保留中文,不要變成 \uXXXX
#indent=2:每層縮排 2 格
#sort_keys=True:依鍵名字母順序排序,輸出更穩定
def main():
data_path = Path("data.json") #建一個指向 data.json 的 路徑物件
data = load_json(data_path) #用剛剛的函式把 data.json 讀成 Python 物件
print("=== 原始資料(漂亮列印) ===") #印一個區塊標題
pretty_print(data) #用美化函式把整份 JSON 漂亮地顯示出來
print("\n=== 指定欄位 ===") #\n 先換行,再印標題
print("name:", data["name"]) #從字典取 name
print("age:", data["age"])
print("email:", data["email"])
print("第一個興趣:", data["hobbies"][0]) #hobbies 是 串列,用索引 [0] 取第一個
print("英文分數:", data["scores"]["english"]) #巢狀取值:scores 是字典,再取 english
print("城市:", data["address"]["city"])
print("note 欄位(可能是 None):", data.get("note"))
#用 .get() 安全取值;note 可能是 None(JSON 的 null)
print("\n=== 安全取值(.get) ===")
print("不存在的欄位:", data.get("not_exist", "預設:沒有這個欄位"))
#取一個不存在的鍵,用 .get(鍵, 預設值) 來給預設文字、避免報錯
print("\n=== 逐一列出興趣 ===")
for i, hobby in enumerate(data["hobbies"], 1):
#用 enumerate(…, 1) 從 1 開始編號,逐一走過 hobbies
print(f"{i}. {hobby}") #用 f-string 印成「1. coding」這種格式
data["hobbies"].append("reading") #在 hobbies 尾端新增一個興趣
data["scores"]["english"] = 90 # 把英文分數 改為 90
with open("data_out.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
#把修改後的 data 寫成 JSON 到檔案
print("\n已輸出修改後的資料到 data_out.json") #提示輸出成功
if __name__ == "__main__": #只有在「直接執行這個檔案」時才會進到下面這行
main() #呼叫主程式
執行:(PowerShell)
python .\read_json.py
應該就可以看到:
=== 原始資料(漂亮列印) ===
{
"address": {
"city": "Taipei",
"zip": "100"
},
"age": 20,
"email": "ming@example.com",
"hobbies": [
"coding",
"basketball",
"music"
],
"name": "王小明",
"note": null,
"scores": {
"english": 85,
"math": 92,
"science": 88
},
"student": true
}
=== 指定欄位 ===
name: 王小明
age: 20
email: ming@example.com
第一個興趣: coding
英文分數: 85
城市: Taipei
note 欄位(可能是 None): None
=== 安全取值(.get) ===
不存在的欄位: 預設:沒有這個欄位
=== 逐一列出興趣 ===
1. coding
2. basketball
3. music
已輸出修改後的資料到 data_out.json
因為列印的是修改前的資料(來自 data.json),所以終端畫面的漂亮列印看不到 "reading" 和英文分數 90,是合理的。
dir
python -m json.tool .\data_out.json
看到多了 reading、英文 90 ,就完成了!