JSONをCSVに変換する方法|手動とツールでのやり方を比較
JSONをCSVに変換したい場面では、まず 「1回だけ少量を直したいのか」「今後も繰り返し処理するのか」 を決めるのが近道です。少量なら手動でも済みますが、APIレスポンスやログのように件数が増えると、jq や Python、Excel の Power Query を使ったほうが速くてミスも減ります。
この記事では、JSONをCSVにする代表的な4パターンを比較しながら、入力例と出力例つきで整理します。対象は、JSONの中身は読めるけれど、CSV化のやり方で止まりやすい初心者から実務初級者です。
- 少量の単純なJSON: 手動で列を決めてCSV化してもよい
- 繰り返し処理: Pythonか
jqが向く - コードを書きたくない: Excelの Power Query が扱いやすい
- 注意点: 入れ子構造、配列、文字コード、改行を先に確認する
ここがポイント: JSONをCSVに変換するときは、変換そのものよりも「どのキーを列にするか」と「入れ子をどう平坦化するか」で結果が決まります。
まず押さえたい前提
JSONとCSVは、見た目以上に得意分野が違います。
JSONは階層構造を持てるので、オブジェクトの中に配列や別のオブジェクトを入れられます。一方、CSVは1行1レコード、1列1値の表形式です。つまり、入れ子のあるJSONは、そのままではCSVにきれいに収まりません。
たとえば次のJSONを見てください。
[
{
"id": 1,
"name": "Tanaka",
"email": "tanaka@example.com",
"department": {
"name": "Sales",
"code": "S01"
}
},
{
"id": 2,
"name": "Sato",
"email": "sato@example.com",
"department": {
"name": "Support",
"code": "C03"
}
}
]
この場合、CSVでは次のように列を決めるのが実務的です。
id,name,email,department_name,department_code
1,Tanaka,tanaka@example.com,Sales,S01
2,Sato,sato@example.com,Support,C03
この「department.name を department_name にする」といった平坦化が、JSONからCSV変換の本題です。
方法の比較
先に結論を表で整理します。
| 方法 | 向いている場面 | 難易度 | 強み | 弱み |
|---|---|---|---|---|
| 手動 | 数件だけ、1回だけ | 低 | すぐ始められる | 件数が増えると破綻しやすい |
| Excel Power Query | コードなしで整形したい | 低〜中 | GUIで展開しやすい | 複雑なネストは調整が必要 |
| jq | CLIで素早く変換したい | 中 | 軽い、再利用しやすい | フィルタに慣れが必要 |
| Python | 業務処理に組み込みたい | 中 | 柔軟性が高い | スクリプトを書く必要がある |
手動でJSONをCSVに変換するやり方
少量データなら、手動でも十分です。ただし、配列の中に配列があるJSON や、項目ごとにキーが揺れるJSONではすぐつらくなります。
手動で済むケース
- 10件前後の小さなJSON
- キーが毎行ほぼ同じ
- 一度きりの提出用データ
- スクリプトやCLIを使えないPC
手動の流れ
- JSONを整形表示する
- 1行ごとに必要なキーを決める
- 列名を先に決める
- 値を表計算ソフトへ貼り付ける
- CSV形式で保存する
手動でやるときのコツ
- 列名はJSONのキー名そのままではなく、
department_nameのように平坦化後を意識して付ける - カンマ、改行、ダブルクォートを含む値はCSVで崩れやすいので注意する
nullを空欄にするのか、nullの文字で残すのかを先に決める
手動方式の欠点は、同じ作業をもう一度やると再現しづらいことです。APIの定期取得や毎月のレポートには向きません。
ExcelのPower Queryで変換する方法
コードを書かずに進めたいなら、Excelの Power Query が扱いやすい選択肢です。Microsoft Learn では JSON コネクタで読み込んだあと、Power Query エディタで表に展開できると案内されています。
向いている場面
- Windows環境でExcelを使っている
- GUIで確認しながら列を増減したい
- 社内メンバーと手順を共有したい
基本手順
- Excelで
データから JSON ファイルを読み込む - Power Query エディタでレコードやリストを展開する
- 不要列を削除する
- 列名を整える
- シートへ読み込んでCSV保存する
どこが便利か
Microsoft Learn の JSON コネクタ資料では、Power Query が JSON から表を自動検出して平坦化を補助すると説明されています。つまり、単純な入れ子ならコードなしでもかなり進めやすい、ということです。
一方で、次のようなJSONは手直しが増えます。
- 配列の中に別の配列がある
- レコードごとにキーが違う
- JSON Lines形式になっている
Microsoft Learn でも、JSON Lines はそのままでは読み込みにくく、追加の変換が必要なケースが示されています。ログ系データを扱うなら、この点は先に確認したほうが安全です。
jqでJSONをCSVに変換する方法
ターミナルが使えるなら、jq はかなり実用的です。jq の公式マニュアルでは、@csv は「入力が配列であること」を前提にCSVとして出力すると説明されています。
最小構成の例
入力ファイル users.json:
[
{"id":1,"name":"Tanaka","email":"tanaka@example.com"},
{"id":2,"name":"Sato","email":"sato@example.com"}
]
コマンド:
jq -r '(["id","name","email"]), (.[] | [.id, .name, .email]) | @csv' users.json > users.csv
出力:
"id","name","email"
1,"Tanaka","tanaka@example.com"
2,"Sato","sato@example.com"
入れ子を平坦化する例
jq -r '(["id","name","department_name","department_code"]), (.[] | [.id, .name, .department.name, .department.code]) | @csv' users.json > users.csv
jqが向いている理由
- サーバーや開発PCでそのまま使いやすい
- ワンライナーで再実行できる
- CIやシェルスクリプトに組み込みやすい
jqで詰まりやすい点
@csvは配列が必要なので、オブジェクトをそのまま渡すと失敗しやすい- キーが存在しないと
nullが混ざる - 深い配列は1行に落とし込むルールを自分で決める必要がある
たとえば tags: ["red", "blue"] のような配列は、そのままCSVの1列にするなら join("|") のように結合方針を決めておくと扱いやすくなります。
PythonでJSONをCSVに変換する方法
業務で何度も使うなら、最終的にはPythonがいちばん融通が利きます。Python標準ライブラリの json モジュールでJSONを読み込み、csv モジュールでCSVを書き出せます。
この記事の例は、Python 3系の標準ライブラリを前提にしています。公式ドキュメントでは、csv 書き込み時に newline='' を指定すること、必要に応じて encoding を明示することが案内されています。
最小例
import json
import csv
with open("users.json", "r", encoding="utf-8") as f:
data = json.load(f)
with open("users.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["id", "name", "email"])
writer.writeheader()
writer.writerows(data)
入れ子に対応する例
import json
import csv
with open("users.json", "r", encoding="utf-8") as f:
data = json.load(f)
rows = []
for item in data:
rows.append({
"id": item.get("id"),
"name": item.get("name"),
"email": item.get("email"),
"department_name": item.get("department", {}).get("name"),
"department_code": item.get("department", {}).get("code"),
})
with open("users.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(
f,
fieldnames=["id", "name", "email", "department_name", "department_code"]
)
writer.writeheader()
writer.writerows(rows)
出力:
id,name,email,department_name,department_code
1,Tanaka,tanaka@example.com,Sales,S01
2,Sato,sato@example.com,Support,C03
Pythonを選ぶべきケース
- 定期処理にしたい
- 変換前に条件分岐や値の補正を入れたい
- API取得からCSV保存まで一連で自動化したい
- エラー処理を入れたい
実務でよくある失敗
変換処理そのものより、データの形で失敗することが多いです。
1. キーが行ごとに違う
JSONでは、ある行にだけ phone があり、別の行にはないことがあります。この場合は以下のどちらかを先に決めます。
- 欠けたキーは空欄で出す
- 必須キーが欠けた行は除外する
2. 配列をどう1列に入れるか決めていない
roles: ["admin", "editor"] のような配列は、そのままCSVの1セルには収まりません。
対処例:
admin|editorのように区切り文字で結合する- 行を分割して1役割ずつ出す
- 配列列はJSON文字列のまま保持する
3. 文字コードでExcel表示が崩れる
UTF-8のCSVは環境によって文字化けに見えることがあります。日本語データをExcel中心で使うなら、開き方まで含めて確認したほうが安全です。
4. 改行やカンマを含む値で列ずれする
CSVは単純に見えて、実際にはクォート処理が重要です。Pythonの csv や jq の @csv を使うと、この部分を任せやすくなります。逆に手作業で貼り替えると、ここで崩れやすいです。
5. JSONが配列ではなく単一オブジェクトだった
JSONファイルが次のように1件だけのオブジェクトだと、配列前提のスクリプトはそのまま動きません。
{"id":1,"name":"Tanaka","email":"tanaka@example.com"}
その場合は、配列に包むか、単一オブジェクト用の処理に分けます。
どの方法を選ぶべきか
迷ったら、次の基準で決めると外しにくいです。
手動が向く人
- 今回だけ処理すればよい
- 件数が少ない
- JSONの構造が浅い
Excel Power Queryが向く人
- コードを書きたくない
- 表を見ながら列を調整したい
- 社内の標準ツールがExcel
jqが向く人
- CLIに抵抗がない
- Linux、macOS、WSL環境で作業している
- ワンライナーで素早く処理したい
Pythonが向く人
- 毎回同じ処理を回したい
- 例外処理や加工もまとめたい
- 将来はAPI連携や自動化まで広げたい
代替手段と使い分け
JSONからCSVへ変換する手段は、今回紹介したものだけではありません。オンライン変換ツールもありますが、業務データでは扱いに注意が必要です。
- 公開APIのサンプルやダミーデータなら試しやすい
- 個人情報、顧客情報、社内データは外部アップロードを避ける
- 再現性が必要なら、GUIよりスクリプトやCLIのほうが残しやすい
セキュリティと再実行性を考えると、実務では Power Query、jq、Pythonのいずれか に寄せたほうが管理しやすい場面が多いです。
まとめ
JSONをCSVに変換する方法は複数ありますが、選び方はシンプルです。
- 少量を一度だけ なら手動
- コードなしで進めたい ならExcel Power Query
- 軽く速く回したい なら
jq - 業務フローに組み込みたい ならPython
次に見るべきポイントは、変換ツールそのものより 自分のJSONに配列や入れ子がどの程度あるか です。そこを先に確認すると、後から列設計をやり直す手間がかなり減ります。
