Python による json 読み込みの基礎から活用までを解説
はじめに
皆さんは、Pythonを使ってデータを扱うときにJSON形式のファイルを読み込む場面を見かけたことはないでしょうか。
JSONは、インターネットを介したデータのやり取りなどで頻繁に使われています。
ただ、プログラミング未経験や学習初心者の方にとっては、「どうやってJSONを読み込めばいいのか」「エラーを起こさずスムーズに操作するにはどうすればいいのか」といった疑問が浮かぶかもしれません。
このような点を解決するために、本記事ではPythonでJSONを読み込む際の基本的な知識から、実務の現場で役立つ活用シーンまでを説明していきます。
実際のコード例も示しながら進めますので、ぜひPythonコードを書きながら確認してみてください。
この記事を読むとわかること
- PythonでJSONを読み込む方法の概要
json
モジュールを使った読み込み手順- よくあるエラーと対処法
- ファイル操作と連携した実務例
- JSONの高度な活用例
PythonでJSONを読み込むとは何か?
JSONはテキストベースでデータを表現する方式なので、Pythonで扱うためにはまず「テキストをPythonのデータ型に変換」することが必要です。
Pythonには標準の**json
モジュール**が用意されており、これを使うだけで比較的簡単にJSONを読み込むことができます。
ここでいう「読み込む」とは、JSON形式の文字列やファイルに書かれている内容をPythonの辞書型やリスト型に変換することを指します。
たとえば、ウェブサービスから取得したJSONレスポンスをアプリケーションの中で処理する際や、アプリケーション設定ファイルをJSONで管理していて、それをPythonスクリプトで読み込む場合などに活用されます。
こうしたシンプルさや利便性から、JSONはさまざまなプログラミング言語で広く採用されています。
JSONとは?
JSON(JavaScript Object Notation)は、キーと値をペアにしてデータを表現したり、値の並びである配列を使ってリストのようにデータを列挙したりできる形式です。
具体例を挙げると、次のようになります。
{ "name": "Alice", "age": 25, "skills": ["Python", "HTML", "CSS"] }
上の例は、名前・年齢・スキル配列をキーと値の形式でまとめています。
ほかにも、ネストされたオブジェクト(入れ子になった構造)を記述できるため、複雑なデータを整理して表現しやすいのが特徴です。
また、多くのプログラミング言語でサポートされており、非常に汎用的なデータ交換フォーマットとして重宝されています。
PythonにおけるJSONの位置づけ
Pythonでは、**辞書型(dict
)**やリスト型(list
)などを使ってデータを柔軟に扱うことが多いです。
JSONを読み込んだ結果は、これらPythonの組み込みデータ型にそのまま対応して格納されます。
ということは、JSON上の
- オブジェクト(
{...}
の部分) → Pythonの辞書型 - 配列(
[...]
の部分) → Pythonのリスト型
として認識されるわけです。
このため、JSON形式の文字列やファイルを読み込んだ後は、Pythonの辞書やリストを操作するのとほぼ同じ感覚で扱えるようになります。
JSONのシンプルな構造とPythonのデータ型の相性はよく、外部APIのレスポンス処理やログ解析、設定ファイルの読み込みなど、さまざまな実務シーンに応用できます。
JSONの基本的な読み込み方法
PythonでJSONを読み込む場合、多くの方が最初に使う機能は**json
モジュール**のloads
やload
といった関数です。
どうやって使い分けるかというと、
loads
: JSON 文字列を読み込み、Pythonオブジェクトへ変換するload
: JSON ファイルオブジェクトを読み込み、Pythonオブジェクトへ変換する
というイメージです。
文字列から読み込む方法
外部サービスからHTTPリクエストで取得したJSONレスポンスが文字列として返ってくる場合、あるいはテスト用にハードコーディングしたJSON文字列などを処理するときに役立ちます。
以下の例では、json.loads
を使ってJSON文字列をPythonの辞書型やリスト型に変換しています。
import json json_str = '{"fruits": ["apple", "banana", "orange"], "count": 3}' data = json.loads(json_str) print(data) # 出力: {'fruits': ['apple', 'banana', 'orange'], 'count': 3} print(data["fruits"]) # リストとして利用可能
このように、文字列から直接loads
関数を使ってデコードできます。
文字列が正しいJSON構文になっていないと、JSONDecodeError
が発生する場合がありますので、エラー処理を挟んでおくと安心です。
ファイルから読み込む方法
一方で、JSONをファイルとして用意し、それをPythonで読み込むケースも多いです。
JSON形式の設定ファイルを使ったり、ログデータや分析データをJSONで保存したりと、ファイル操作の機会は意外と多いものです。
import json # file.json が存在すると仮定 with open("file.json", "r", encoding="utf-8") as f: data = json.load(f) print(data)
json.load
を使う場合は、ファイルパスやエンコーディングに気をつけましょう。
日本語などマルチバイト文字が含まれるJSONファイルを読み込むときは、open
関数にencoding="utf-8"
を指定すると文字化けが起きにくいです。
もし、別の文字コードを使っている場合は適切なエンコーディングを指定する必要があります。
実務での活用シーン
JSONの読み込みは、単なる学習的な練習だけでなく、実務でも重要な役割を果たします。
以下では、具体的にどのような場面で役立つかを解説します。
外部APIとの連携
多くのWebサービスは、APIのレスポンスをJSONで返すことが一般的です。
たとえば、天気情報や為替情報などを取得する際に、Pythonのrequests
ライブラリを使ってAPIを呼び出し、返ってきたJSONレスポンスをjson.loads
でパースして利用する方法があります。
これにより、取得したデータを辞書型やリスト型として簡単に操作できます。
「任意のキーを取得して画面に表示する」「特定の値を元に計算をする」といった処理がスムーズにできるでしょう。
設定ファイルとして活用
アプリケーションの設定値(ポート番号やデータベース情報など)をJSONファイルで管理する例もあります。
この場合、次のように設定ファイルを開いて内容を読み込み、それを辞書型として使います。
import json with open("config.json", "r", encoding="utf-8") as f: config = json.load(f) db_host = config["database"]["host"] db_port = config["database"]["port"] print(db_host, db_port)
こうしておくと、設定値をコードから切り離して管理できるため、環境の違いに応じてファイルを切り替えるだけで済みます。
また、変更や拡張が発生しても、コードに直接手を加えなくてよい場合が多いので、保守管理がしやすくなります。
Webアプリケーションでのデータ受け渡し
FlaskやDjangoなどのWebフレームワークを使う場合、HTMLテンプレートへ渡すデータをPythonの辞書型やリスト型で扱うことがあります。
たとえば、バックエンドからJSONレスポンスを返す場合や、フロントエンドとJSONでやり取りをする場合などです。
JSONの読み込みだけでなく、書き出し(エンコード)も合わせて理解しておくと、フロントエンドとバックエンドのデータ受け渡しがスムーズになります。
よくあるエラーと対処法
JSONの読み込みでは、思わぬところでエラーが起きることがあります。
初心者の方の多くが遭遇しやすいエラーをいくつか紹介し、その原因と対処法を簡単に説明します。
JSONDecodeError
JSONの構文が壊れている場合や、不正な文字が含まれている場合に発生します。
たとえば、文字列に余分なカンマがあったり、JSONで許可されていないコメントが含まれていたりする状況です。
対処法としては、まずはJSONが正しい形式かをチェックしてみましょう。
オンラインのJSONバリデータなどを活用すると、どこで構文エラーが起きているかを可視化しやすいです。
ファイルパスの間違い
json.load
で指定したファイル名やパスが間違っていると、ファイルが見つからずエラーになります。
相対パスと絶対パスを間違えることもあるので、ファイルが正しく置かれているディレクトリを確認してください。
作業ディレクトリとファイルの格納ディレクトリが違う場合は、正しいパスを指定する必要があります。
文字コード問題
特にWindows環境で日本語を含むJSONファイルを扱うときに起きやすいです。
open
関数で読み込む際にエンコーディングを指定していなかったり、ファイル側が別の文字コードで保存されている場合、デコードエラーが起きることもあります。
utf-8
で保存するのが一般的ですが、もし実務の現場で別の文字コードが使われているなら、対応するエンコーディングを明示しておくことが重要です。
Pythonのjsonモジュールの代表的な機能
jsonモジュールでは、JSONを読み込む以外にも書き込む機能があります。
これらの機能は実務でセットで使われることが多いため、ここで簡単に整理してみましょう。
loadとloadsの違い
前述のとおり、
load
: ファイルオブジェクトを受け取るloads
: 文字列を受け取る
この違いが大きいです。
ファイルを扱うならwith open("xxx.json", "r")
と一緒にjson.load
を呼び出す。
文字列を扱うならjson.loads("...")
を呼び出す、と覚えておくとよいでしょう。
dumpとdumpsの違い
「JSONを書き出す」場合に用いるのがdump
/dumps
です。
dump
: ファイルオブジェクトに対してJSON形式を書き込むdumps
: PythonオブジェクトをJSON形式の文字列として返す
いずれも、Pythonの辞書やリストを渡すだけで、あとはJSON形式に変換してくれます。
あわせてインデントの指定なども可能で、整形済みJSONを出力したいときに役立ちます。
import json data = { "name": "Bob", "age": 30, "languages": ["Python", "JavaScript"] } # JSON文字列に変換 json_str = json.dumps(data, indent=2) print(json_str) # ファイルに書き込む with open("output.json", "w", encoding="utf-8") as f: json.dump(data, f, indent=2)
JSONと他のデータ形式の比較
JSON以外にもデータ交換や保存に使われる形式はたくさん存在します。
ここでは、代表的なCSVとXMLの2つと比較してみます。
CSVとの比較
CSVはテキストベースで行と列を区切る単純な形式です。
表形式のデータ(スプレッドシートなど)では扱いやすい一方、データ構造がネストしにくいのが弱点です。
JSONはオブジェクトやリストをネストさせられるため、階層構造を持つデータを取り扱う場合に向いています。
たとえば、ある商品の在庫情報や属性情報を細かく管理する場合、JSONの方が柔軟に表現できます。
一方で、「単純なリストだけを扱えば十分」という場合は、CSVがわかりやすいかもしれません。
XMLとの比較
XMLはタグを使ってデータをマークアップする形式で、柔軟性があるものの、JSONよりも文章量が増えやすい傾向があります。
JSONの方が記述が簡潔で、一般的なプログラミング言語とも親和性が高いです。
ただし、XMLはスキーマを定義してデータの構造を厳密に管理したい場面では便利なこともあります。
どちらが優れているというよりも、用途と要件に応じて選択されることが多いです。
JSONの高度な活用例
ここから先は、もう少し実務に近い形での活用例を取り上げます。
初学者の方は、まずは基本的な読み書きに慣れてからチャレンジしてみてください。
リストや辞書を扱うケース
JSONでは、配列(Pythonでいうリスト)とオブジェクト(Pythonでいう辞書)が組み合わせて使われます。
リストの中に辞書を入れ、さらにその中でリストを持つといった構造も考えられます。
{ "users": [ { "id": 1, "name": "Alice", "hobbies": ["reading", "swimming"] }, { "id": 2, "name": "Bob", "hobbies": ["cooking"] } ] }
上記のようなJSONを読み込んだ場合、Pythonでは多重リストや多重辞書を操作する感覚でデータにアクセスできます。
ネストされたデータ構造
ネストされたJSONデータは、より複雑な階層構造を持っています。
たとえば、オンラインショップの商品情報を格納するときに、商品カテゴリ・在庫数・販売履歴など、さまざまな属性を入れ子にして記述することがあります。
その際に、Pythonでデータを処理しやすくなるようにクラスや関数を分割して、データを分かりやすい形で扱う工夫が実務では求められます。
また、データベースに格納するときは、JSON形式のまま保存してもいいのか、あるいは構造化して別テーブルに分割するのか、といった検討も必要です。
JSON Lines形式
JSONを1行ごとに区切って、大量のデータを扱う場合に使われるのがJSON Lines形式です。
ログ解析やビッグデータの処理でよく見かけます。
各行が独立したJSONオブジェクトになっているため、ストリーム処理をしながら1行ずつ読み込むようなケースで使われます。
{"user": "Alice", "action": "login"} {"user": "Bob", "action": "purchase", "item": "book"} {"user": "Charlie", "action": "logout"}
Pythonで読み込む場合も、テキストファイルを一行ずつ取り出してjson.loads
に渡すだけです。
データ量が非常に多い場合は、一括で読み込むとメモリを圧迫するかもしれないので、行単位で処理していく方法が適しています。
JSON Lines形式のファイルを扱うときは、一行ずつjson.loads
で処理する方法がよく使われます。
空行や途中でフォーマットが崩れないよう注意してください。
まとめ
PythonでJSONを読み込む方法は、json
モジュールを使ってload
やloads
を呼び出すことが基本です。
この機能を活用することで、
- 外部APIから受け取ったレスポンスを扱いやすい形にする
- 設定ファイルやログデータを読み込んでアプリケーションの動作を制御する
- Webアプリケーションとフロントエンドでデータをやり取りする
など、幅広い場面で役立ちます。
また、現場での活用を考えると、エラー対策や文字コードの取り扱いも重要なポイントです。
JSONを正しく扱えるようになると、データ処理の幅が広がります。
皆さんが初めてJSONファイルを読み込むときには、まずは基本的なjson.load
やjson.loads
を試してみてください。
その上で、複雑な入れ子構造への対応やJSON Lines形式などを少しずつ学んでいくと、実務の場でも応用しやすくなるのではないでしょうか。