Pythonの基礎知識(基礎編)

【Pythonの基礎知識】JSONで構造化データを操る

Pythonでデータを扱う場面では、構造化された情報をやり取りするためにJSON(JavaScript Object Notation)が最も多く利用されます。

特にWeb APIやログ設計、設定ファイルなど、現場での登場頻度は圧倒的です。

Pythonでは標準ライブラリの「json」モジュールを使うだけで、辞書型(dict)やリスト型をJSON形式に変換したり、その逆を行うことができます。

この記事では、実務で遭遇した「文字化け」や「型の不一致」といった落とし穴を交えながら、JSONの正しい扱い方と安全な入出力処理の基礎を理解していきます。

Pythonの基礎知識(基礎編)


🟣 Pythonの基礎知識(基礎編)
📌基本文法から実用テクニックまで、Pythonの土台を固めるステップアップ講座
└─ 【Pythonの基礎知識(基礎編)】仕組みから学ぶ思考と自動化のプログラミング講座
  ├─ STEP 0:Pythonを動かす“仕組み”を理解する
  | ├─【Pythonの基礎知識】Pythonを動かす環境とは何か? “自分専用の環境”を作る
  | ├─【Pythonの基礎知識】Hello Worldの裏側にある実行の仕組み
  | └─【Pythonの基礎知識】Pythonのファイル構造と実行パスを理解する
  |
  ├─STEP 1:Pythonで“考える仕組み”を作る(思考編)
  | ├─【Pythonの基礎知識】データ型で世界を定義する|数・文字・真偽の正体
  | ├─【Pythonの基礎知識】変数と値の動きを通して仕組みを理解しよう
  | ├─【Pythonの基礎知識】条件分岐で“判断を任せる”仕組みを作る
  | ├─【Pythonの基礎知識】for文で“人の手”を離す仕組みを作る
  | └─【Pythonの基礎知識】while文で“継続する仕組み”を作る
  |
  ├─STEP 2:Pythonで“情報を扱う仕組み”を作る(構造編)
  | ├─【Pythonの基礎知識】コレクション型の正しい選び方(list, tuple, dict, set)
  | ├─【Pythonの基礎知識】リストで情報を整理し、仕組みに流れを持たせる
  | ├─【Pythonの基礎知識】辞書型でデータを“意味”で管理する
  | └─【Pythonの基礎知識】集合型で重複を排除し、無駄をなくす仕組みを作る
  |
  ├─STEP 3:Pythonで“動きを再利用する仕組み”を作る(関数・モジュール編)
  | ├─【Pythonの基礎知識】関数で処理を再利用する|“人間の手順”を仕組みに変える
  | ├─【Pythonの基礎知識】引数と戻り値で“情報のやりとり”を自動化する
  | ├─【Pythonの基礎知識】モジュールとパッケージで“仕組みを部品化”する
  | └─【Pythonの基礎知識】importの裏側を理解し、コードを分離する設計思考
  |
  ├─STEP 4:Pythonで“データを扱う仕組み”を作る(入出力・永続化編)
  | ├─【Pythonの基礎知識】ファイル操作でデータを読み書きする仕組みを作る
  | ├─【Pythonの基礎知識】CSVを自在に扱う仕組みを作る
  | ├─【Pythonの基礎知識】JSONで構造化データを操る
  | └─【Pythonの基礎知識】例外処理で“壊れない仕組み”を設計する
  |
  └─STEP 5:Pythonで“自動化する仕組み”を作る(応用実践編)
    ├─【Pythonの基礎知識】スクリプトを自動実行させる仕組みを作る
    ├─【Pythonの基礎知識】日次タスクを自動化して人の時間を解放する
    ├─【Pythonの基礎知識】外部APIを活用して作業を外部化する
    └─【Pythonの基礎知識】ログを記録して仕組みの信頼性を高める

JSONとは何か

Pythonでデータを扱うとき、最も登場するフォーマットの一つがJSONです。

JSONは「JavaScript Object Notation」の略で、データを「構造化」して表現するためのフォーマットです。

人間が読めて、機械も理解できるという特徴を持つため、Web APIやログ管理、設定ファイルなどで幅広く利用されています。

Pythonでは標準ライブラリ「json」モジュールを使うだけで、辞書やリストといったPythonの基本データ構造を簡単にJSON形式に変換できます。

JSONって何がそんなに便利なの?

CSVでもいいんじゃない?

CSVは単純な表形式のデータを扱うのに向いているけれど、入れ子構造や階層を表すのは苦手なんだ。ユーザー情報と購入履歴のような複雑なデータを扱うなら、JSONのほうが圧倒的に効率的だよ。

JSONの仕様・特徴とPythonとの関係

JSONは、文字列・数値・真偽値・配列・オブジェクトなどの基本構成要素で成り立っています。

Pythonでいうと、それぞれが以下のように対応します。

JSONの型Pythonの対応型
objectdict
arraylist
stringstr
numberint / float
booleanbool
nullNone

このように、PythonではJSONデータを直接辞書やリストとして扱えるため、変換が非常にスムーズです。

たとえば、辞書をJSON形式に変換するコードは以下の通りです。

import json
data = {"name": "BePro", "age": 38, "skills": ["Python", "Shell", "Java"]}
json_text = json.dumps(data, ensure_ascii=False, indent=2)
print(json_text)

【出力例:】

{
  "name": "BePro",
  "age": 38,
  "skills": [
    "Python",
    "Shell",
    "Java"
  ]
}

indentって何?

なくても動くけど?

indentは見た目を整えるためのスペース数を指定しているんだ。実行自体には不要だけど、ログや出力ファイルを人が読むときには整形しておくと解析しやすくなるよ。

実体験:構造化データ誤用で起きたトラブル

実務の現場では、JSONの扱いを誤るとデータ破損や通信エラーの原因になることがあります。

以前、API連携処理を自動化する際に、チームのメンバーが辞書をそのままprint出力して保存した結果、JSONとして不正な形式が混入するトラブルが発生しました。

# 誤った例
f = open("user_data.json", "w")
print(data, file=f) # Pythonの辞書をそのまま出力してしまう

この状態ではファイル内が「{'name': 'BePro'}」のようにPython独自の書式になり、他システムで読み込めません。

正しい方法はjson.dump()を使ってJSON形式に変換してから書き込むことです。

# 正しい例
with open("user_data.json", "w", encoding="utf-8") as f:
  json.dump(data, f, ensure_ascii=False, indent=2)

【出力例:】

{
  "name": "BePro"
}

printで出しても見た目は同じに見えたけど、どこが違うの?
見た目は似ていても、Pythonの辞書はシングルクォーテーションを使うけど、JSONはダブルクォーテーションで統一されているんだ。この違いだけでシステム間通信が失敗することがあるよ。だから常にjson.dump()やjson.dumps()を使うのが安全なんだ。

こうした経験を通して、単に動くコードを書くのではなく、他のシステムや人が使うことを前提に「形式を守る意識」を持つことが大切だと学びました。

JSONは便利ですが、正確さを軽視するとすぐに問題が顕在化します。

PythonでJSONを扱う基本操作

PythonでJSONを扱うときに欠かせないのが標準ライブラリの「json」モジュールです。

外部ライブラリをインストールする必要はなく、インポートするだけで簡単に利用できます。

主な機能は2つあり、PythonのデータをJSONに変換する「シリアライズ」と、JSONをPythonオブジェクトに変換する「デシリアライズ」です。

この2つを正しく理解することで、API連携や設定ファイルの操作を安全に行えるようになります。

シリアライズとかデシリアライズって難しく聞こえるけど、結局何をしてるの?
ざっくり言うと、Pythonの辞書やリストを「JSONという外の世界に出せる形にする」ことがシリアライズで、その逆に戻すのがデシリアライズだよ。つまり、データを行き来させる“通訳”みたいな役割なんだ。

jsonモジュールによるシリアライズ/デシリアライズ

Pythonでは、jsonモジュールを使って次の関数でJSONを簡単に変換できます。

処理関数名説明
シリアライズjson.dumps()PythonオブジェクトをJSON文字列に変換
シリアライズjson.dump()PythonオブジェクトをファイルにJSON形式で出力
デシリアライズjson.loads()JSON文字列をPythonオブジェクトに変換
デシリアライズjson.load()JSONファイルを読み込みPythonオブジェクトに変換

import json
# Pythonの辞書をJSON文字列に変換
data = {"user": "BePro", "age": 38, "active": True}
json_text = json.dumps(data, ensure_ascii=False, indent=2)
print(json_text)

【出力例:】

{
  "user": "BePro",
  "age": 38,
  "active": true
}

このように「dumps()」を使うと、辞書やリストをJSONとして出力できます。

ensure_ascii=Falseを指定することで、日本語などのマルチバイト文字も文字化けせずに扱えます。

また、indentを指定すると整形されて読みやすくなります。

dumpsとdumpって名前が似てるけど、どう違うの?
dumpsは文字列に変換するだけ、dumpはファイルに書き込むものなんだ。よく混同されるけど、出力先が違うだけで中身の動作はほぼ同じだよ。

# JSONをファイルに出力
with open("user.json", "w", encoding="utf-8") as f:
  json.dump(data, f, ensure_ascii=False, indent=2)

【出力例:】cat user.json

{
  "user": "BePro",
  "age": 38,
  "active": true
}

次に、ファイルや文字列からJSONを読み込む例を見てみましょう。

# JSON文字列をPythonの辞書に変換
json_text = '{"user": "BePro", "age": 38, "active": true}'
data = json.loads(json_text)
print(data["user"])

【出力例:】

BePro

こうして見ると、JSONってPythonの辞書とそっくりなんだね
その通り。だからPythonではJSONを扱うのがとても自然なんだよ。型の変換ルールさえ知っていれば、APIやログ処理もスムーズに進む。

例示コードと変数説明

ここでは実際に使用したコードの変数を整理しておきます。理解しておくと、他のプロジェクトでもそのまま応用できます。

変数名意味
dataPythonの辞書データ。JSON化したい情報を保持。{"user": "BePro", "age": 38}
json_textJSON形式の文字列。API通信などで利用。'{"user": "BePro", "age": 38}'
fファイルオブジェクト。読み書きのために使用。open("user.json", "w")
毎回この変換って面倒じゃない?自動でできる方法はないの?
確かに都度呼ぶのは手間だけど、関数にまとめてしまえばいい。システム開発では「読み込み関数」と「書き込み関数」を1つずつ定義して再利用するのが基本だよ。

このように、Pythonのjsonモジュールは直感的でシンプルながら、データ交換の要となる強力な機能を持っています。

慣れるとAPI開発やログ出力の精度も大幅に向上します。

実践:ファイル/APIデータでJSONを活用

ここからは、実際にファイルや外部APIと連携してJSONデータを活用する方法を解説します。

ファイル操作を通して「保存と再利用」を、APIからの取得を通して「通信と解析」を学ぶことで、Pythonで扱うデータの幅が一気に広がります。

特に、Web開発や自動化スクリプトではJSONを扱えないと処理が途端に複雑になります。

実務で頻出するシーンを想定して理解を深めていきましょう。

JSONファイルって、結局どうやって使うの?
JSONは「データを保存して後で再利用する仕組み」として使うことが多いんだ。設定情報、ログデータ、APIレスポンスなど、いろんな場面で共通して扱えるのが最大の利点だよ。

JSONファイルの読み書き

まずはファイルとしてJSONデータを保存し、後からそれを読み込む基本的な流れを確認します。

Pythonでは json.dump()json.load() を使えば、わずか数行で実現できます。

import json
data = {"user": "BePro", "role": "engineer", "active": True}

# JSONファイルに書き込み
with open("user.json", "w", encoding="utf-8") as f:
  json.dump(data, f, ensure_ascii=False, indent=2)

# JSONファイルを読み込み
with open("user.json", "r", encoding="utf-8") as f:
  loaded = json.load(f)

print(loaded["user"])

【出力例:】

BePro

このコードでは、まずdata辞書をJSONファイルに保存し、その後同じファイルを開いて再度辞書型として読み込んでいます。

ファイルの内容を確認したい場合は、次のようにLinuxコマンドで表示できます。

cat user.json

【出力例:】

{
  "user": "BePro",
  "role": "engineer",
  "active": true
}

printとcatの結果って何が違うの?
printはPythonがファイルを読み込んで出力した結果、catはOSが直接ファイルを開いた内容なんだ。どちらも同じ中身だけど、catはファイルが正しく書き出されたかを確認するのに便利だよ。

また、json.dump()を使うことでエンコードエラーを防ぎながら日本語も安全に扱えます。

ensure_ascii=Falseを指定しておけば、マルチバイト文字も文字化けせずに保存されます。

外部APIから取得したJSONを処理した実体験

次に、実務でよくあるケースとして「APIから取得したJSONデータを処理する」例を見てみましょう。

最近、筆者が社内ツールの自動化を行った際、外部APIから社員情報を取得して整形するタスクをPythonで実装しました。

import requests
import json

response = requests.get("https://api.example.com/users/123")
data = response.json()

print(data["name"])

【サーバーから送られてきたJSONデータ】

{
  "id": 123,
  "name": "BePro",
  "department": "system",
  "active": true
}

このとき、response.json() によって上記の内容がPythonの辞書に変換され、data["name"] は "BePro" を取り出して表示します。 

【出力例:】

BePro

このように requests モジュールを使えば、APIレスポンスを簡単にJSONとして受け取ることができます。

Pythonの辞書として扱えるため、ループで一覧を作ったり、条件に応じて抽出したりといった処理も簡単です。

APIのレスポンスってファイルと違って毎回変わるよね?

それでも同じように扱えるの?

もちろん扱えるよ。ポイントは「レスポンスを一度変数に入れる」こと。ファイルと同じように辞書やリストとして扱えるから、処理の流れは変わらないんだ。

APIの結果をファイルに保存すれば、あとでオフライン解析にも利用できます。

たとえば次のように、取得したデータをローカルにキャッシュすることもできます。

with open("api_result.json", "w", encoding="utf-8") as f:
  json.dump(data, f, ensure_ascii=False, indent=2)

【出力例:】(= cat api_result.json)

{
  "name": "BePro",
  "department": "system",
  "active": true
}

APIの結果をファイルに残す意味ってある?
あるよ。たとえばAPIが一時的に落ちたときも、キャッシュファイルがあれば前回の結果を再利用できる。

これは自動化や運用スクリプトでよく使うテクニックだね。

気をつけること/落とし穴と対策

JSONは便利で柔軟なデータ形式ですが、扱いを誤ると「文字化け」や「データ型の不一致」といった問題が発生します。

特にPythonと外部システムのやり取りでは、エンコード設定や型の違いによるトラブルが起こりやすく、原因が見えにくいため注意が必要です。

ここでは、筆者が実際に遭遇したミスや対策を交えながら、運用上で押さえておくべきポイントを解説します。

JSONって人間にも読みやすいって言うけど、なんでエラーが出ることがあるの?
人間が読めるフォーマットではあるけど、コンピュータ同士がやり取りする以上は「ルールの違い」で噛み合わないことがあるんだ。特に文字コードとデータ型の違いは油断しやすいポイントだよ。

文字コード・データ型のズレ/互換性の課題

PythonでJSONを扱う際に最も多いトラブルは、「文字コードの違いによる文字化け」と「データ型の変換ミス」です。

JSONはUTF-8を前提としていますが、システムによってはShift_JISやEUC-JPで保存されていることもあります。

たとえば、次のようなケースです。

import json
with open("config.json", "r", encoding="utf-8") as f:
  data = json.load(f)

ファイルをUTF-8以外の文字コードで保存していた場合、上記のようなコードでも読み込み時に「UnicodeDecodeError」が発生します。

この場合は、ファイルのエンコードを統一するか、読み込み時に正しい文字コードを指定することが重要です。

with open("config.json", "r", encoding="shift_jis") as f:
  data = json.load(f)

UTF-8が標準なのに、なんでShift_JISのまま使われてるケースがあるの?
昔の日本向けシステムはShift_JISが主流だったんだ。業務で古いデータを扱うと、今でもそのまま残っていることが多い。だからPythonで扱う前に、文字コードを揃えるのが最初の一歩なんだよ。

もうひとつの落とし穴は、型の違いです。

たとえばJSONの数値はPythonで自動的にintやfloatに変換されますが、True/Falseが「true」「false」に置き換わるなど微妙な差異があります。

外部システムに送信する際は、この違いが原因で「型エラー」や「不正フォーマット」と判定されることがあります。

data = {"price": 100, "active": True}
print(json.dumps(data))

【出力例:】

{"price": 100, "active": true}

見た目ではほとんど同じですが、PythonではTrue、JSONではtrue(小文字)と表現される点が異なります。

このような違いを理解しておくと、他システムとの連携がスムーズになります。

実体験から学んだ運用上の注意点

筆者が実務でJSONを扱った際、最も苦労したのは「仕様変更への追随」と「ログ出力時の混乱」でした。

JSON形式の設定ファイルを運用していたところ、ある日突然APIのレスポンスに新しいキーが追加され、読み込みスクリプトがKeyErrorで停止しました。

try:
  value = data["new_key"]
except KeyError:
  value = None

このように例外処理を入れておくことで、予期せぬ変更にも柔軟に対応できます。

システムが「壊れにくい設計」になるというのが大きなメリットです。

確かに現場では仕様が変わることが多いね。

じゃあログはどうしてる?

ログはJSONで出力しておくと、あとで分析しやすいんだ。特にjson.dumps()で整形して保存しておけば、grepやjqコマンドでも簡単に検索できる。

さらに、ファイルサイズが大きくなった場合は、圧縮や世代管理も検討すべきです。

不要なキーを削除したり、1ファイルごとに日付を付けて保存するなどの工夫をすれば、障害対応のときも素早く原因を特定できます。

mv user.json user_$(date +"%Y%m%d").json

【出力例:】

user_20251103.json

このような細やかな管理を続けることで、JSONデータの信頼性と保守性が格段に高まります。

便利な仕組みほど、扱い方次第で強力にも脆弱にもなる——そのことを意識して運用していくことが、エンジニアとしての確かな強みになります。

まとめ

JSONは、Pythonと外部システムをつなぐ“共通言語”のような存在です。

ファイルへの保存、APIとの通信、そして設定管理など、あらゆる場面で利用できます。

扱い方を理解しておくことで、データの流れを設計できるようになり、開発や運用の精度が大きく向上します。

結局、JSONを覚えると何が変わるの?
データの受け渡しがスムーズになるだけじゃなく、他のエンジニアやシステムとの協調がしやすくなるんだ。つまり、コードの“つながり”を設計できるようになるのが最大の強みだよ。

す。JSONを自在に扱えるようになることは、Pythonエンジニアとしての確かな基礎を築く第一歩です。

次のおすすめ記事

よく読まれている記事

1

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか? 無料で使えるだけでなく、高い柔軟 ...

2

Linux環境でよく目にする「Vim」という名前。サーバーにログインしたら突然Vimが開いてしまい、「どうやって入力するの?」「保存や終了ができない!」と困った経験をした人も多いのではないでしょうか。 ...

3

ネットワーク技術は現代のITインフラにおいて不可欠な要素となっています。しかし、ネットワークを深く理解するためには、その基本となる「プロトコル」と「レイヤ」の概念をしっかり把握することが重要です。 こ ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

5

Javaは世界中で広く使われているプログラミング言語であり、特に業務システムやWebアプリケーションの開発において欠かせない存在です。本記事では、初心者向けにJavaの基礎知識を網羅し、環境構築から基 ...

-Pythonの基礎知識(基礎編)