PythonでJSONデータの扱いをマスター!API連携に必須のjsonモジュールの使い方
プログラミングを学び始めると、必ずと言っていいほど耳にするのがJSONという言葉です。
Web APIからデータを取得したり、設定ファイルを保存したりする際に、このデータ形式は避けて通れません。
なんとなく難しそうと感じている方も多いかもしれませんが、実はPythonを使えば簡単に扱えます。 この記事では、エンジニア歴10年の知見を交えながら、初心者の方がJSONを完璧に使いこなせるようになるまでを丁寧に解説します。
なぜ今JSONを学ぶ必要があるのか?¶
現代のソフトウェア開発において、異なるシステム間でデータをやり取りする際の標準はJSONになっています。 かつてはXMLという形式が主流でしたが、より軽量で人間にも読みやすいJSONがその座を奪いました。
皆さんが普段使っているスマホアプリやWebサイトの裏側でも、このJSON形式でデータが飛び交っています。 Pythonでデータ分析をするにしても、Webアプリを作るにしても、JSONの知識は必須の武器となるでしょう。
プログラミングの世界で一歩先へ進むために、まずはこのデータの正体を正しく理解することから始めましょう。 最初は戸惑うこともあるかもしれませんが、基本的なルールさえ押さえれば怖くありません。
JSONの正体とPython辞書との違い¶
JSONは「JavaScript Object Notation」の略称ですが、JavaScript専用の言葉ではありません。 テキストベースのデータ表現方法であり、多くのプログラミング言語で共通して利用できるのが強みです。
見た目はPythonの辞書型(dict)にそっくりですが、実は決定的な違いがあります。 それは、JSONはあくまでただの文字列であるという点です。
Pythonの辞書型はメモリ上で管理されるオブジェクトですが、JSONはネットワークで送受信するためのテキストデータです。 この「データ型」と「文字列」を行き来させる作業が、プログラミングにおけるJSON処理の本質と言えます。
まずは、JSONで扱える主なデータ型とPythonの型がどのように対応しているかを表で確認してみましょう。
| JSONのデータ型 | Pythonのデータ型 | 例 |
|---|---|---|
| オブジェクト (Object) | 辞書 (dict) | {"key": "value"} |
| 配列 (Array) | リスト (list) | [1, 2, 3] |
| 文字列 (String) | 文字列 (str) | "Hello" |
| 数値 (Number) | 数値 (int / float) | 123, 3.14 |
| 真偽値 (Boolean) | 真偽値 (bool) | true -> True |
| ヌル値 (Null) | None型 (None) | null -> None |
つなぎとして補足しておくと、JSONではキー(Key)は必ずダブルクォーテーションで囲う必要があります。 Pythonの辞書のようにシングルクォーテーションを使うとエラーになるので注意してください。
jsonモジュールの主要4関数を覚えよう¶
PythonでJSONを扱うには、標準ライブラリのjsonモジュールを使います。
新しくインストールする必要はなく、コードの冒頭で import json と書くだけで準備完了です。
このモジュールには多くの機能がありますが、初心者が覚えるべきはたったの4つだけです。 これら4つの関数の違いを理解すれば、日常的な開発の9割以上はカバーできます。
1つ目のグループは、メモリ上の変数と文字列を変換する関数です。 2つ目のグループは、ファイルと変数を直接やり取りするための関数です。
言葉だけで説明されてもイメージが湧きにくいと思うので、具体的なシチュエーションを想像してみましょう。 Web APIから届いた文字データをPythonで解析したい時はどれを使うべきでしょうか。
文字列としてJSONを扱う(loadsとdumps)¶
まずは、プログラム内でJSON形式の文字列を扱う方法を見ていきましょう。
ここで登場するのが loads と dumps という2つの関数です。
末尾の「s」は「String(文字列)」の略だと覚えると、忘れにくくなります。
json.loads() は文字列を読み込み、Pythonの辞書やリストに変換してくれる便利な道具です。
import json
# JSON形式の文字列(Web APIなどから受け取った想定)
json_str = '{"name": "Python Taro", "age": 25, "is_student": false}'
# 文字列をPythonの辞書に変換
data = json.loads(json_str)
print(data["name"]) # Python Taro と表示される
print(type(data)) # <class 'dict'> と表示される
逆に、PythonのデータをJSON形式の文字列に変換したい時は json.dumps() を使います。
これをシリアライズと呼び、データを保存したり送信したりする際に必要な工程です。
# Pythonの辞書データ
user_dict = {
"id": 1,
"active": True,
"tags": ["beginner", "python"]
}
# 辞書をJSON文字列に変換
json_output = json.dumps(user_dict)
print(json_output)
# {"id": 1, "active": true, "tags": ["beginner", "python"]} と表示される
ここで注目してほしいのは、Pythonの True が JSONでは小文字の true に変わっている点です。
こうした細かい変換を自動でやってくれるのが、ライブラリを使う最大のメリットですね。
【関連記事】Pythonのf-stringとは?デバッグが驚くほど楽になる!
ファイルとしてJSONを扱う(loadとdump)¶
次に、設定ファイルやデータベースの代わりとしてJSONファイルを読み書きする方法を解説します。
ここでは末尾に「s」がつかない load と dump を使用します。
これらの関数は、ファイルオブジェクトを直接引数に取るのが特徴です。 大量のデータを扱う場合、一度すべてを文字列として読み込むよりメモリに優しく処理できます。
# ファイルへの書き込み(保存)
user_info = {"version": "1.0.0", "author": "admin"}
with open("config.json", "w", encoding="utf-8") as f:
json.dump(user_info, f)
ファイルを読み込む際も、同じように with 構文を使ってファイルを開いてから実行します。
これにより、ファイルの閉じ忘れを防ぐことができ、安全にデータを取得できます。
# ファイルからの読み込み
with open("config.json", "r", encoding="utf-8") as f:
config = json.load(f)
print(config["version"])
エンジニアとして10年働いてきた経験から言うと、ファイル操作時の文字コード指定は命です。
encoding="utf-8" を忘れると、環境によって文字化けが発生し、深刻なバグの原因になります。
日本語を扱う時の必須テクニック¶
日本語を含むデータを扱う際、初心者が必ずと言っていいほど直面する壁があります。
それは、出力されたJSONの中身が \u3042 のような謎の記号に化けてしまう現象です。
これはバグではなく、JSONの標準仕様で「ASCII文字以外はエスケープする」という設定が有効だからです。 しかし、人間が中身を確認する時には非常に不便ですよね。
この問題を解決するには、ensure_ascii=False という魔法のオプションを追加します。
これだけで、日本語がそのままの形で保存されるようになり、可読性が劇的に向上します。
data = {"message": "こんにちは、Python!"}
# オプションなしだと \u3053\u3093... となる
json_ascii = json.dumps(data)
# ensure_ascii=False をつけると日本語で出力される
json_japanese = json.dumps(data, ensure_ascii=False)
print(json_japanese)
データのやり取り相手が機械だけならエスケープされていても問題ありません。 しかし、デバッグ作業やログ出力を考慮するなら、この設定は常にセットで覚えておきましょう。
見やすいJSONを出力する方法¶
プログラムが出力するJSONは、デフォルトではスペースや改行がない一行の塊になっています。 これでは、データ構造が複雑になった時に人間が中身を理解するのは不可能です。
そんな時に役立つのが indent 引数です。
このオプションを指定するだけで、指定したスペースの数で綺麗に整形(整形出力)してくれます。
heavy_data = {
"users": [
{"id": 1, "name": "Alice", "skills": ["Python", "AWS"]},
{"id": 2, "name": "Bob", "skills": ["React", "Go"]}
]
}
# インデント4で整形して出力
print(json.dumps(heavy_data, indent=4, ensure_ascii=False))
さらに、キーの順番をアルファベット順に並べ替えたい場合は sort_keys=True を使います。
データの比較を行う際や、Gitなどで差分を管理する際に非常に重宝するテクニックです。
こうした「見せ方」の工夫は、チーム開発において非常に高く評価されるポイントです。 自分が書いたコードを他の誰か(未来の自分を含む)が読む時のことを常に意識しましょう。
Web APIとの連携イメージ¶
JSONを学ぶ真の目的は、多くの場合Web APIとの連携にあるはずです。
有名な requests ライブラリと組み合わせて使う場面を想定してみましょう。
多くのモダンなAPIは、レスポンスとしてJSONを返してくれます。
requests ライブラリには、取得したデータを直接辞書に変換するメソッドも備わっています。
import requests
import json
# 仮のAPIエンドポイント
url = "https://api.example.com/v1/users"
response = requests.get(url)
if response.status_code == 200:
# response.json() は内部で json.loads() を実行している
user_list = response.json()
for user in user_list:
print(f"User: {user['name']}")
このように、JSONの扱いをマスターすれば、世界中のWebサービスから情報を集めることが可能になります。 天気予報を取得したり、株価を分析したり、夢が広がりますよね。
ただし、APIから常に正しいデータが返ってくるとは限りません。 予期せぬデータが届いた時にプログラムが止まらないよう、例外処理もセットで考えるのがプロの仕事です。
【関連記事】Pythonの例外処理のアンチパターン5選をご紹介!|初心者がやりがちな「べからず集」
よくあるエラーと対処法¶
JSONを扱っていると、必ず一度は JSONDecodeError というエラーに遭遇します。
これは「JSONとして正しくない文字列を読み込もうとした」時に発生する怒りのメッセージです。
原因は様々ですが、よくあるパターンをいくつか挙げてみましょう。 まずはこれらをチェックするだけで、解決までの時間を大幅に短縮できるはずです。
- 末尾のカンマ:
{"a": 1, "b": 2,}のように最後に関係ないカンマがある - 引用符の間違い:シングルクォーテーションで囲っている
- データの欠落:APIからの返却値が空っぽだった
特に初心者がハマりやすいのが、複数行の文字列をそのまま扱おうとすることです。 JSON文字列の中に改行が含まれている場合、適切にエスケープされていないと解析に失敗します。
エラーが出た時は、対象の文字列をJSONバリデーターなどのWebツールに貼り付けてみてください。 どこが間違っているのかを視覚的に教えてくれるので、学習の助けになります。
実務での「落とし穴」¶
ここからは、私が10年のキャリアの中で実際に遭遇した痛い失敗を共有します。 これから学習を進める皆さんが、同じ罠にハマらないためのアドバイスです。
1つ目は、日付データの扱いです。 驚くべきことに、JSON標準には「日付型」というものが存在しません。
Pythonの datetime オブジェクトをそのまま json.dumps() しようとすると、型エラーで落ちます。
日付を扱う際は、必ず文字列(ISO 8601形式など)に変換してから処理する必要があります。
from datetime import datetime
now = datetime.now()
# そのままではエラーになる
# data = {"time": now}
# json.dumps(data)
# 文字列に変換してから扱うのが正解
data = {"time": now.isoformat()}
print(json.dumps(data))
2つ目は、数値の精度に関する問題です。 非常に大きな数字や、細かい小数を扱う際、言語間で微妙な誤差が生じることがあります。
金額計算など、1円の狂いも許されない処理では、数値をあえて文字列として送受信するテクニックも使われます。 たかがテキストデータと侮らず、中身の型には常に敏感でいてください。
まとめ¶
PythonでのJSON操作について、基本から実務的なテクニックまで幅広く解説してきました。
一見難しそうに見えるデータ処理も、json モジュールの使い方さえ覚えれば強力な武器になります。
まずは loads と dumps を自分の手で動かしてみることから始めてください。
小さなスクリプトでも、自分で書いたコードでデータが形を変える瞬間は感動するものです。
プログラミングの学習に近道はありませんが、こうした基礎を一つずつ積み上げることが確実な歩みです。 この記事が、皆さんのPythonライフをより豊かにする一助となれば幸いです。
これからも楽しみながらコードを書いていきましょう。 ここまでお読みいただきありがとうございました