Python 中的 JSON 操作與 API 通訊完整指南|驗證與安全對策解析

1. JSON是什麼?(基礎知識)

JSON的概述

JSON(JavaScript Object Notation)是一種常用於客戶端與伺服器之間通訊的數據格式。它輕量且易於閱讀,結構簡單,因此被廣泛應用於Web應用程式和行動應用程式。由於JSON是純文字格式,因此可以在任何程式語言中輕鬆處理,具備極高的通用性。

JSON的基本結構

JSON使用「鍵值對」的方式來表示數據。例如,以下是JSON的基本結構:

{
  "名稱": "佐藤",
  "年齡": 30,
  "興趣": ["閱讀", "電影"]
}

在此範例中,名稱 是字串,年齡 是數字,興趣 是陣列。由於結構簡單且可讀性高,使得數據傳輸變得非常高效。

JSON的優勢

  1. 輕量且高效:由於是純文字格式,因此佔用的網路流量較少,減輕了網路負擔。
  2. 高度相容:幾乎所有的程式語言都支援JSON,因此可跨多個平台使用。
  3. 解析簡單:易於讀取和寫入,特別適用於API通訊。

2. Python中的JSON操作(基礎篇)

Python的json模組

在Python中,可以使用json模組來輕鬆讀取和寫入JSON數據。例如,將JSON字串轉換為Python的字典(dict)可以使用json.loads()函式:

import json

json_data = '{"名稱": "佐藤", "年齡": 30}'
python_obj = json.loads(json_data)

print(python_obj)  # {'名稱': '佐藤', '年齡': 30}

相反地,如果要將Python的物件轉換為JSON格式,可以使用json.dumps()

python_obj = {"名稱": "佐藤", "年齡": 30}
json_data = json.dumps(python_obj, ensure_ascii=False)

print(json_data)  # {"名稱": "佐藤", "年齡": 30}

讀取與寫入JSON檔案

還可以從JSON檔案中讀取數據,或是將數據寫入JSON檔案:

# 從檔案讀取
with open('data.json', 'r') as f:
    data = json.load(f)

# 寫入檔案
with open('data.json', 'w') as f:
    json.dump(python_obj, f, ensure_ascii=False)
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

3. Python中的JSON通訊(實踐篇)

使用requests模組進行API通訊

透過requests模組,可以輕鬆地透過API發送與接收JSON數據。以下範例展示如何使用POST請求發送JSON數據並接收回應。

使用POST請求發送JSON數據

import requests

url = 'https://example.com/api'
data = {'名稱': '佐藤', '年齡': 30}

response = requests.post(url, json=data)
json_response = response.json()

print(json_response)

使用GET請求接收JSON數據

使用GET請求也可以輕鬆從API獲取JSON數據。

response = requests.get('https://example.com/api/user/1')
data = response.json()

print(data)

 

4. 錯誤處理與最佳實踐

API通訊中的錯誤處理

在API通訊過程中,若發生錯誤,正確處理錯誤回應非常重要。以下範例展示如何捕獲網路錯誤、超時錯誤等異常情況。

try:
    response = requests.post(url, json=data)
    response.raise_for_status()
except requests.exceptions.HTTPError as errh:
    print("HTTP 錯誤:", errh)
except requests.exceptions.ConnectionError as errc:
    print("連線錯誤:", errc)
except requests.exceptions.Timeout as errt:
    print("超時錯誤:", errt)
except requests.exceptions.RequestException as err:
    print("其他錯誤:", err)

重試機制

在網路不穩定的情況下,實作重試機制有助於提高請求的成功率。使用requests模組時,可以透過Retry類來實作重試邏輯。

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

session = requests.Session()
retry = Retry(connect=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)

response = session.get(url)
侍エンジニア塾

5. JSON驗證

使用jsonschema進行驗證

為了確保從API接收的JSON數據符合預期格式,可以使用jsonschema庫來進行數據驗證。

from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "名稱": {"type": "string"},
        "年齡": {"type": "number"}
    },
    "required": ["名稱", "年齡"]
}

json_data = {"名稱": "佐藤", "年齡": 30}

try:
    validate(instance=json_data, schema=schema)
    print("JSON 格式有效")
except ValidationError as e:
    print("驗證錯誤:", e)

此方法也適用於更複雜的數據結構,包括嵌套的物件,確保API返回的數據符合預期。

6. JSON安全性最佳實踐

API密鑰的管理

API密鑰不應該直接硬編碼在程式碼內,應該透過環境變數來管理,以降低安全風險。

import os

api_key = os.getenv('API_KEY')

數據清理與安全處理

在將用戶輸入的數據發送至伺服器之前,應適當清理數據,以防止SQL注入和跨網站腳本攻擊(XSS)。

from html import escape

safe_data = escape(user_input)

避免JSON反序列化攻擊

在處理不受信任的JSON數據時,應該避免直接使用eval()來解析數據,而應使用官方提供的json.loads()方法來解析JSON,以防止代碼執行漏洞。

import json

unsafe_json = '{"名稱": "佐藤", "年齡": 30}'
data = json.loads(unsafe_json)  # 安全解析
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

7. 總結

在本指南中,我們學習了如何使用Python進行JSON操作與API通訊,包括基本的JSON讀寫、錯誤處理、數據驗證以及安全性考量。掌握這些技巧後,無論是在開發Web應用程式還是資料處理,JSON都將成為一個強大的工具。

透過遵循最佳實踐,例如適當的錯誤處理、數據驗證和安全性措施,可以確保您的應用程式更可靠、更安全。希望本指南對您有所幫助!