4日目のゴール
4日目のテーマは
「APIから返ってきた“複雑なJSON”を、ちゃんと読めて、欲しい形に整えて表示できるようになる」 ことです。
1〜3日目であなたはすでに、URLにアクセスしてJSONを辞書やリストとして受け取り、エラー処理付きで扱えるようになりました。
4日目では一歩進んで、「ネストしたJSON(入れ子構造)」を読み解き、ループや整形表示を使って「人間にとって分かりやすい形」に変換する力を鍛えます。
ここができると、APIのドキュメントを見たときに「うわ、項目多い…」ではなく、「ああ、ここからここを取り出せばいいね」と落ち着いて見られるようになります。
JSONの「入れ子構造」をちゃんとイメージする
辞書とリストの組み合わせとして見る
APIのレスポンスは、シンプルな場合はこうでした。
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
これは「キーと値のセット」だけなので、Pythonではそのまま「辞書」として扱えます。
でも、実際のAPIでは、もっと複雑な形がよく出てきます。
例えば、ユーザー情報のAPIはこんな感じです(例):
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
}
ここで大事なのは、「辞書の中に辞書が入っている」「辞書の中にさらに辞書が入っている」という入れ子構造になっていることです。
Pythonで response.json() した結果は、
「外側が dict、その中の address も dict、その中の geo も dict」という形になります。
ネストしたJSONから値を取り出す
「ドットで辿る」イメージを「[]で辿る」に変換する
さっきのユーザー情報を data という変数に入れたとします。
import requests
url = "https://jsonplaceholder.typicode.com/users/1"
response = requests.get(url, timeout=5.0)
data = response.json()
Pythonこのとき、欲しい情報をどう取り出すかを見ていきます。
名前は data["name"] で取れます。
メールアドレスは data["email"] です。
では、「市区町村(city)」はどこにあるでしょうか。
JSONを見ると、address の中に city があります。
つまり、Pythonではこう書きます。
city = data["address"]["city"]
Pythonさらに、緯度(lat)は address の中の geo の中の lat です。
lat = data["address"]["geo"]["lat"]
Pythonここでの本質は、「ドットで辿る感覚」を「[] を重ねる形」に変換することです。
data.address.city ではなくdata["address"]["city"]
data.address.geo.lat ではなくdata["address"]["geo"]["lat"]
と書く、と覚えておけばOKです。
JSONを「きれいに眺める」ためのテクニック
json.dumps でインデント付き表示
レスポンスのJSONをそのまま print(data) すると、
一行でずらっと出てきて、かなり読みにくいです。
そんなときは、標準ライブラリの json モジュールを使って、
インデント付きで「きれいに整形」して表示すると、構造が一気に見やすくなります。
import requests
import json
url = "https://jsonplaceholder.typicode.com/users/1"
response = requests.get(url, timeout=5.0)
data = response.json()
print(json.dumps(data, indent=2, ensure_ascii=False))
Pythonここでのポイントは、json.dumps の引数です。
indent=2 は、「2スペースでインデントして整形してね」という意味です。ensure_ascii=False は、日本語などの文字をそのまま表示するための指定です(APIによっては不要ですが、覚えておくと便利です)。
これを一度やってみて、
「どこに何が入っているか」を目で確認してから、
必要なキーを辿るようにすると、迷子になりにくくなります。
「リストの中の辞書」を扱う
users のような「配列レスポンス」を読む
多くのAPIは、「1件」ではなく「複数件」を返します。
例えば、ユーザー一覧はこんな形です。
[
{ "id": 1, "name": "Leanne Graham", ... },
{ "id": 2, "name": "Ervin Howell", ... },
{ "id": 3, "name": "Clementine Bauch", ... }
]
これはPythonでは「リスト(list)」になります。
中身の1件1件は「辞書(dict)」です。
つまり、data がこのJSONのとき、type(data) は list で、data[0] は dict です。
import requests
url = "https://jsonplaceholder.typicode.com/users"
response = requests.get(url, timeout=5.0)
users = response.json()
print("型:", type(users))
print("件数:", len(users))
first = users[0]
print("1件目の名前:", first["name"])
print("1件目のメール:", first["email"])
Pythonここでの重要ポイントは、「リスト+辞書」の組み合わせを自然に扱えるようになることです。
「全員の名前とメールを表示したい」ときは、for文で回します。
for user in users:
print(user["id"], user["name"], user["email"])
Pythonuser は1件分の辞書なので、user["name"] のようにアクセスできます。
ネスト+リストを組み合わせて読む
「ユーザー一覧から、住所だけを抜き出す」例
さっきのユーザー一覧 users から、
「id・名前・市区町村」だけを表示してみます。
import requests
url = "https://jsonplaceholder.typicode.com/users"
response = requests.get(url, timeout=5.0)
users = response.json()
for user in users:
user_id = user["id"]
name = user["name"]
city = user["address"]["city"]
print(f"{user_id}: {name} / {city}")
Pythonここでやっていることはシンプルです。
for user in users: で、リストの中の辞書を1件ずつ取り出す。user["address"]["city"] で、ネストした辞書の中の値を取り出す。
それを f文字列で整形して表示する。
この「リストを回しながら、ネストした辞書を辿る」パターンが、
APIレスポンスを扱うときの基本形になります。
「欲しい形に整形してから使う」という発想
生のJSONをそのまま使わない
APIから返ってくるJSONは、
「サーバー側の都合で決められた形」です。
あなたのアプリから見たときには、
「ちょっと情報が多すぎる」「欲しい形と違う」
ということがよくあります。
そこで大事になるのが、
「一度、自分の欲しい形に変換してから使う」
という発想です。
例えば、ユーザー情報から
「id・name・city だけを持つ辞書のリスト」に変換してみます。
import requests
def fetch_simple_users():
url = "https://jsonplaceholder.typicode.com/users"
response = requests.get(url, timeout=5.0)
if response.status_code != 200:
print("取得に失敗しました。")
return []
users = response.json()
result = []
for user in users:
item = {
"id": user["id"],
"name": user["name"],
"city": user["address"]["city"],
}
result.append(item)
return result
def main():
simple_users = fetch_simple_users()
for u in simple_users:
print(u)
if __name__ == "__main__":
main()
Pythonここでの本質は、「変換用のステップ」を一つ挟んでいることです。
APIの生データ(users)
→ 自分のアプリ用のシンプルなデータ(simple_users)
この変換をしておくと、
後でGUIに表示するときや、ファイルに保存するときに、
扱いやすくなります。
4日目のミニアプリ:ユーザー住所ビューア(コンソール版)
仕様を言葉で整理する
ユーザー一覧APIを叩く。
id・名前・市区町村・会社名を整形して表示する。
「どのキーからどの情報を取っているか」を意識しながら書く。
コードはこうなります。
import requests
import json
def fetch_users():
url = "https://jsonplaceholder.typicode.com/users"
try:
response = requests.get(url, timeout=5.0)
except requests.exceptions.RequestException as e:
print("通信エラー:", e)
return None
if response.status_code != 200:
print("エラー応答です。ステータスコード:", response.status_code)
return None
try:
return response.json()
except ValueError:
print("JSONとして解釈できませんでした。")
return None
def show_users_pretty(users):
print("=== 生のJSON(最初の1件だけ整形表示) ===")
print(json.dumps(users[0], indent=2, ensure_ascii=False))
print()
print("=== 整形した一覧表示 ===")
for user in users:
user_id = user["id"]
name = user["name"]
city = user["address"]["city"]
company = user["company"]["name"]
print(f"[{user_id}] {name} / {city} / {company}")
def main():
users = fetch_users()
if users is None:
print("ユーザー情報の取得に失敗しました。")
return
show_users_pretty(users)
if __name__ == "__main__":
main()
Pythonこのミニアプリで、4日目のポイントを一気に体験できます。
json.dumps(..., indent=2) で構造を目で確認する。
リストの中の辞書を for で回す。
ネストした辞書を ["address"]["city"] のように辿る。
欲しい情報だけを取り出して、1行に整形して表示する。
4日目で絶対に押さえてほしい本質
「JSONの形を“怖がらずに分解する目”を持つ」
今日いちばん大事なのは、
APIレスポンスを見たときに、こう考えられるようになることです。
これは「リストの中に辞書が入っている形だな」
このキーの中に、さらに辞書が入っているな
ここからここまで辿れば、欲しい値に届くな
そのための具体的な技術が、
json.dumps(..., indent=2) で構造を目で確認すること。data["key"]["subkey"] のように [] を重ねて辿ること。
リストなら for item in data: で1件ずつ処理すること。
一度「自分用のシンプルな形」に変換してから使うこと。
ここまでできると、
APIドキュメントに載っているサンプルJSONを見ただけで、
「Pythonでどう書けばいいか」が自然と浮かぶようになります。
5日目以降は、
今日の「JSONの読み解き力」と、
これまでの「エラー処理」「共通関数」「GUIの基礎」を組み合わせて、
いよいよ「ボタンを押したらAPIからデータを取ってきて、画面にきれいに表示する」
という“本物感のあるAPI取得アプリ”に進んでいきましょう。


