APIのレスポンスやログで受け取った JSON を、Excelで開ける CSV にしたい——地味によくある作業です。この記事では、
- コードで変換する方法(JavaScript / Python)
- コードを書かずにコピペで一発変換する方法
の両方を、そのまま使える形でまとめます。
この記事のゴール:JSONの配列を、ヘッダー付きのCSVに変換できるようになること。
前提:JSONの「配列」がCSVになる
CSVに変換しやすいのは、オブジェクトの配列(各要素が同じキーを持つ)です。
[
{ "id": 1, "name": "田中", "email": "tanaka@example.com" },
{ "id": 2, "name": "佐藤", "email": "sato@example.com" }
]
これは次のCSVに対応します。
id,name,email
1,田中,tanaka@example.com
2,佐藤,sato@example.com
- オブジェクトのキー → CSVのヘッダー行
- 配列の各要素 → CSVの1行
ポイントは、値の中に ,(カンマ)・"(ダブルクオート)・改行が含まれる場合のエスケープです。ここを雑にやると、Excelで列がズレます。
方法1:JavaScriptで変換する
ライブラリなしで書けます。エスケープ処理込みの実装がこちらです。
const data = [
{ id: 1, name: "田中", email: "tanaka@example.com" },
{ id: 2, name: "佐藤, 太郎", email: "sato@example.com" } // カンマを含む例
];
function toCSV(rows) {
if (rows.length === 0) return "";
const headers = Object.keys(rows[0]);
// カンマ・改行・"を含む値は " で囲み、" は "" にエスケープ
const escape = (v) => {
const s = String(v ?? "");
return /[",\n]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s;
};
const lines = [
headers.join(","),
...rows.map((row) => headers.map((h) => escape(row[h])).join(","))
];
return lines.join("\n");
}
console.log(toCSV(data));
出力:
id,name,email
1,田中,tanaka@example.com
2,"佐藤, 太郎",sato@example.com
name にカンマが含まれる行が、きちんと "..." で囲まれているのがポイントです。
方法2:Pythonで変換する
pandasを使う(手軽)
import pandas as pd
data = [
{"id": 1, "name": "田中", "email": "tanaka@example.com"},
{"id": 2, "name": "佐藤", "email": "sato@example.com"},
]
df = pd.DataFrame(data)
df.to_csv("output.csv", index=False, encoding="utf-8-sig")
Excelで開くなら
encoding="utf-8-sig"がおすすめです。BOM付きになるので、日本語が文字化けしません。
標準ライブラリだけで(pandasなし)
import csv, json
with open("data.json", encoding="utf-8") as f:
data = json.load(f)
with open("output.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=data[0].keys())
writer.writeheader()
writer.writerows(data)
csv モジュールがエスケープを自動でやってくれるので安心です。
方法3:コピペで一発変換(コードを書きたくない時)
「1回だけ変換したい」「手元で軽く確認したい」なら、コードを書かずに貼り付けるだけのツールが速いです。
私が作っている Morphy の JSON⇄CSV 変換なら、
- JSONを貼り付けてボタンひとつでCSVに(逆方向のCSV→JSONも可)
- Excelからコピーした表(タブ区切り)もそのまま読み込める
- ネストしたJSONも列に展開
- 処理はすべてブラウザ内で完結し、データは外部に送信されません(社内データでも安心)
登録不要・無料で、こういう「ちょっとした変換」に使えます。
👉 JSON⇄CSV変換ツール:https://datamorph.paste-convert.workers.dev/json-csv.html
補足:ネストしたJSONはどうする?
次のように入れ子になっている場合、
[
{ "id": 1, "user": { "name": "田中", "age": 30 } }
]
そのままでは1列に収まりません。**フラット化(平坦化)**して、
id,user.name,user.age
1,田中,30
のように user.name / user.age へ展開するのが定番です。コードでやるなら pandas の json_normalize が便利です。
import pandas as pd
df = pd.json_normalize(data)
df.to_csv("output.csv", index=False, encoding="utf-8-sig")
(前述のMorphyでも、ネストしたJSONは自動で列に展開されます)
まとめ
| 状況 | おすすめの方法 |
|---|---|
| バッチ処理・自動化に組み込む | JavaScript / Python |
| 大量データ・繰り返し変換 | Python(pandas) |
| 1回だけ・手元でサッと | コピペできる無料ツール |
用途に合わせて使い分けてください。特に「今すぐ1回変換したいだけ」なら、ツールにコピペするのがいちばん速いです。
この記事が、JSON⇄CSV変換の手間を少しでも減らせたら嬉しいです。