Python | 1 日 120 分 × 7 日アプリ学習:API取得アプリ(requests使用)(中級編)

Web APP Python
スポンサーリンク

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"])
Python

user は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取得アプリ”に進んでいきましょう。

タイトルとURLをコピーしました