1. JSONとは?(基礎知識)
JSONの概要
JSON(JavaScript Object Notation)は、クライアントとサーバー間の通信に頻繁に利用されるデータフォーマットです。軽量で読みやすく、シンプルな構造であるため、Webアプリケーションやモバイルアプリケーションで広く使用されています。JSONはテキスト形式であり、どの言語でも簡単に取り扱えるため、非常に汎用性が高いです。
JSONの基本構造
JSONはキーと値のペアでデータを表現します。例えば、以下のようなJSONの構造があります:
{
"名前": "佐藤",
"年齢": 30,
"趣味": ["読書", "映画"]
}
この例では、名前
は文字列、年齢
は数値、趣味
は配列です。構造がシンプルで、可読性が高いため、データのやり取りが非常に効率的です。
JSONの利点
- 軽量で効率的: テキストフォーマットであり、通信量が少ないため、ネットワーク負荷が軽減されます。
- 互換性が高い: ほぼすべてのプログラミング言語でサポートされており、複数のプラットフォームでの利用が可能です。
- パースが簡単: データの読み書きが簡単で、特にAPI通信において強力なツールです。
2. PythonでのJSON操作(基本編)
Pythonのjson
モジュール
Pythonでは、json
モジュールを使って簡単にJSONデータの読み書きが可能です。たとえば、JSONデータをPythonの辞書型に変換するには、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データをファイルから読み込んだり、ファイルに書き込んだりすることも可能です。
# ファイルから読み込む
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)
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 Error:", errh)
except requests.exceptions.ConnectionError as errc:
print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
print("OOps: Something Else", 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 is valid")
except ValidationError as e:
print("Validation Error:", e)
複雑なスキーマやネストされたオブジェクトにも対応することができ、これによりAPIからのデータを確実に検証できます。
6. セキュリティに関するベストプラクティス
APIキーの管理
APIキーはソースコード内にハードコードせず、環境変数などで管理することが推奨されます。これにより、セキュリティリスクを低減できます。
import os
api_key = os.getenv('API_KEY')
データのサニタイズ
ユーザーからの入力データをサーバーに送信する前に、適切なサニタイズ処理を行うことで、SQLインジェクションやクロスサイトスクリプティング(XSS)から守ることができます。
from html import escape
safe_data = escape(user_input)