6つの方法をひと目で見る
詳しく見る前に、まず全体を一度に把握しよう。早く選ぶコツは、5つの選択肢を消すことである。方法1のクライアントサイドの変換ページは、インストールが不要でファイルを自分のパソコンに置いたままにできるが、ファイルごとにクリックを繰り返す。方法2の標準ライブラリだけのPythonは、Python 3さえあればよく、フラットなデータを完璧に扱えるが、ネストした値はPythonのreprテキストのまま残る。方法3のpandasを使ったPythonは、ネストしたオブジェクトを自動でドット記法の列にフラット化するが、pandasのインストールが必要で、リストには一行の修正がなお必要である。方法4のjqは、フラットなデータならターミナルで一行で済むが、ネストしたデータには間違った表を出すのではなく、はっきりと失敗する。方法5のNodeスクリプトは、ネストしたオブジェクトをフラット化し、リストを結合するヘルパーを全文読める形で持ち、プロジェクトに自然に入る。方法6のVS CodeやExcelは、すでに使っているツールなら新しくインストールする必要がなく、細かい制御と引き換えに手軽さを得られる。
2つの質問で、読み進める前にリストのほとんどが消える。第一に、データはフラットか、ネストしているか。フラットなデータ、つまり1つのオブジェクトに一段のキーしかないデータは、6つの方法すべてで扱える。ネストしたデータ、つまりオブジェクトの中にオブジェクトがあったり、オブジェクトの中にリストがあったりするデータは、フラット化を追加しない限り、素のjqワンライナーと素のPython標準ライブラリのスクリプトでは扱えない。第二に、この作業をまたやるか。一度だけの変換なら、ページか、すでに持っているツールが向いている。毎週のエクスポートなら、スクリプトが向いている。同じコマンドなら、毎回同じ順序で同じ列が得られるからである。この2つの質問を頭に入れておけば、このガイドの残りは早見表になる。
このガイドのすべての主張は、公開前に同じサンプルで試した。注文が3件で、それぞれにid、名前と都市を持つネストしたcustomerオブジェクト、tagsのリスト、totalがある。フラットなデータしか扱えない方法には、同じファイルのフラットな版を使った。ある方法がネストしたデータで失敗する場合は、このガイドはそのまま書き、失敗を丸めずに正確な失敗の姿を見せる。見える失敗は、気づけない間違った表よりも安全だからである。
方法1:クライアントサイドの変換ページ
最も簡単なローカルな方法は、このページにある変換ツールであり、ウェブサイト上にあってもローカルに数えられる。JSONを貼り付けたりファイルをアップロードしたりすると、ページがJSONを解析し、フラット化し、ブラウザのタブの中でCSVテキストを作り、ダウンロードするファイルとして渡す。アップロードの手順はなく、データを待つサーバーもない。変換のコードはページと一緒に届き、自分のパソコンで動くからである。ネットワークに触れるページ上のボタンは、入力したウェブアドレスからJSONを読み込む任意のURL取得ボタンだけである。取得ではなく貼り付けやアップロードを使えば、ネットワークは一度も使われない。
この主張は、30秒ほどで自分で確かめられる。変換ツールを開き、ネットワークを切るか機内モードにしてから、JSONを貼り付けて変換してみよう。それでも動く。変換にネットワークが必要ないからである。プライバシーの主張は、信じるのではなく一度確かめる価値がある。そしてこの主張はその検査に通る。
このページは、一度だけのファイル、インストールができないパソコン、そしてスクリプトを決める前に変換したいファイルに向いている。ページである以上、限界はページと同じである。ファイルごとにクリックを繰り返し、とても大きなファイルではタブが遅くなる。列の順序やフラット化の動きといった一部の判断も、自分のコードではなくページのオプションに任せることになる。一つのファイルなら、その限界は問題にならない。毎週のエクスポートなら、下のスクリプトを選び、ページは手早い確認用に残そう。
方法2:Python標準ライブラリだけを使う方法
Pythonは、たいていの人にとって最も役立つローカルな方法である。開発者のパソコンの多くにすでに入っており、標準ライブラリだけでも十分だからである。pandasもパッケージも、ダウンロードするものは何もない。下のスクリプトは、オブジェクトの入ったJSONファイルを読み、最初のオブジェクトから列名を取り、標準のcsvモジュールでCSVを書く。引用符の処理はcsvモジュールが正しくやってくれる。json2csv.pyとして保存し、python3 json2csv.py orders.json orders.csvと実行する。
import json, csv, sys
with open(sys.argv[1]) as f:
rows = json.load(f)
with open(sys.argv[2], 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=rows[0].keys())
writer.writeheader()
writer.writerows(rows)3件の注文サンプルで試すと、このスクリプトはヘッダー行に3行のデータ行を作り、正直な限界がはっきり見える。ネストしたcustomerオブジェクトはPythonのrepr文字列として出てきて、tagsのリストもreprのリストとして出てくる。素のDictWriterはネストした値をフラット化しないので、フラットなデータは完璧に変換され、ネストしたデータは目に見えて間違った形で変換される。少なくとも見つけやすい。修正方法は、書き出す前にネストしたオブジェクトをドット記法のキー、たとえばcustomer.nameやcustomer.cityに変える短い再帰関数であり、それはまさに方法5のNodeスクリプトがやっていることである。
ここではcsvモジュールが本当の仕事をしている。区切り文字を含むセルを引用符で囲み、内側の引用符を二重にし、表計算ソフトが期待する改行で書く。値をカンマでつないで自分でCSVを作ってはいけない。手作りの結合は、値の中に最初のカンマが出た時点で壊れる。そしてその壊れ方は静かである。ファイルは列がずれるまで問題なく見える。標準ライブラリ版は、Python 3のあるパソコンならどこでも同じように動き、だから同僚にも同じ変換を走らせたいときに選ぶ方法になる。
方法3:pandasのjson_normalizeを使うPython
方法2が正直な最小限だとすれば、方法3はたいていの人が本当に欲しい上位版である。pandasの関数json_normalizeは、ネストしたオブジェクトを受け取り、自分で書くヘルパーなしに自動でドット記法の列に変える。つまりcustomerは、customer.nameとcustomer.cityになる。下のスクリプトは同じ注文ファイルを読み、正規化してCSVに書く。pandasのインストールが一度必要だが、その後は作業全体が3行である。
import json, pandas as pd
with open('orders.json') as f:
rows = json.load(f)
df = pd.json_normalize(rows)
df.to_csv('orders.csv', index=False)同じ3件の注文サンプルで試すと、json_normalizeはid、tags、total、customer.name、customer.cityの列と3行を作った。期待すべき動きはこれである。ネストしたオブジェクトはフラット化され、フラットな項目はそのまま通り、フラット化されたネスト列はフラットな列のあとに来る。リストが残りの注意点である。tagsのリストは、方法2と同じくPythonのreprテキストとして出てきた。json_normalizeはリストが何を意味するか推測しないからである。一行の修正方法は、書き出す前に短いリストを結合することである。たとえばtags列の各値を、リストならセミコロンと空白でつなぎ、そうでなければそのままにする処理を加えると、読みやすいセルになる。リストの各項目をそれぞれ自分の行にしたい場合は、それは別の操作、つまり展開であり、pandasにはそのための別の展開手順がある。規則は簡単である。フラット化はオブジェクトを扱い、結合は短いリストを扱い、展開は行を意味するリストを扱う。
pandasは、データがネストしていて、書き出す前に掃除や絞り込みをしたい場合、そしてすでにPythonで作業している場合に向いている。パッケージのインストールができない場合や、jqやページで速く終わるフラットなファイルを一度だけ扱う場合には向いていない。インストールが唯一の本当のコストであり、2回目の変換で元が取れる。
方法4:jq、フラットなデータ向けのワンライナー
すでにターミナルを使っているなら、jqを使えば作業全体が一行になる。ただしフラットなデータに限る。jqはJSONを読み、最初のオブジェクトからキーをヘッダーとして取り、すべての行をCSVの行として出し、引用符の処理は専用の書式で行う。スクリプトファイルも、ループも、手作業の引用符処理もいらない。下のコマンドは、1件の注文にidとcityとtotalがあるフラットな注文ファイルを読み、orders.csvに書く。限界をはっきり書いておく。この書式はネストしたオブジェクトとリストを拒むので、このワンライナーはフラットなエクスポート専用であり、前の節のネストしたサンプルでは間違った表ではなくエラーで失敗する。これは安全な種類の失敗である。
jq -r '(.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ]])[] | @csv' orders-flat.json > orders.csvフラットな3件の注文ファイルで試すと、出力は引用符付きのヘッダー行と、それに続く3行のデータ行で、文字列のセルは引用符付き、数字は引用符なしという、まさにその書式が作る形になった。keys_unsortedという細部が重要である。素のkeysでは列がアルファベット順に並び替えられ、ファイルの列順序が変わってしまう。データにネストしたオブジェクトがある場合、jqにはまずフラット化のフィルターが必要で、ワンライナーは小さなスクリプトに育つ。フラットなエクスポート、つまりたいていのAPIのリスト応答が包みを解いたあとにすでにそうなっているものについては、ワンライナーが作業全体であり、jqの入ったパソコンならどこでもオフラインで動く。
一つ注意点がある。jqはファイル全体をメモリに読み込むので、数ギガバイトのエクスポートではブラウザのタブと同じように苦しくなる。普通のエクスポート、数十メガバイトまでなら一瞬である。とても大きなファイルの場合は、まずファイルを分割するか、ストリーミングのツールを使おう。それは変換とは別の問題として扱うべきである。
方法5:Node、変換がプロジェクトの中に住む場合
Nodeは、変換が一度だけの作業ではなくプロジェクトの一部である場合、つまりビルド手順やデータパイプライン、チームがすでに走らせているスクリプトである場合に向いたローカルな方法である。NodeにはJSONの解析が組み込まれているので、残りの仕事は行をCSVテキストに変えることだけであり、下の小さなスクリプトは、ネストしたオブジェクトをドット記法の列にするヘルパーを使ってそれを行い、変換ページの動きと一致させる。json2csv.mjsとして保存し、node json2csv.mjs orders.json orders.csvと実行する。
import { readFileSync, writeFileSync } from 'node:fs';
const flatten = (obj, prefix = '', out = {}) => {
for (const [k, v] of Object.entries(obj)) {
const key = prefix ? prefix + '.' + k : k;
if (v && typeof v === 'object' && !Array.isArray(v)) flatten(v, key, out);
else out[key] = Array.isArray(v) ? v.join('; ') : v;
}
return out;
};
const rows = JSON.parse(readFileSync(process.argv[2], 'utf8')).map(r => flatten(r));
const cols = [...new Set(rows.flatMap(r => Object.keys(r)))];
const esc = v => v == null ? '' : /[",\n]/.test(String(v)) ? '"' + String(v).replaceAll('"', '""') + '"' : String(v);
const lines = [cols.join(','), ...rows.map(r => cols.map(c => esc(r[c])).join(','))];
writeFileSync(process.argv[3], lines.join('\n'));同じサンプルで試すと、このスクリプトはid、customer.name、customer.city、tags、totalというヘッダーと3行を作り、ネストしたcustomerオブジェクトは2列にフラット化され、tagsのリストはセミコロンと空白で結合された。エスケープ関数は、変換ページと同じ規則に従う。セルに区切り文字か引用符か改行が含まれるときだけ引用符で囲み、内側の引用符は二重にする。この規則がCSVの引用符処理の全体であり、これを正しく行うことが、きれいに開くファイルと、静かに列がずれるファイルの違いになる。
このスクリプトは、走らせる前に読めるよう、わざと短くしてある。すべての行にわたる列の和集合を取るので、項目の欠けた行は空のセルになり、これは変換ページと一致する。大きなファイル向けのストリーミングや、列名の変更が必要なら、それらはこのスクリプトへの追加であり、置き換えではない。
方法6:すでに持っているツール、VS CodeとExcel
さらに2つのローカルな方法は、すでに使っているツールなら新しくインストールする必要がない。VS Codeでは、拡張機能がコマンドパレットから開いているJSONファイルをCSVに変換する。ファイルを編集中なら、これが最も速いローカルな道である。どの拡張機能か、正確なコマンドは何かを含む詳しい手順は、下にリンクしたVS Codeのガイドにある。Excelでは、Power Queryが自分のディスクからJSONファイルを読み、ファイルが自分のパソコンを離れることなく表に変える。手順は、データ、データの取得、ファイルから、JSONから、列を展開して読み込みである。どちらも、ツールが入ってしまえば完全にオフラインであり、どちらも作業全体を通してファイルを自分のパソコンに置いたままにする。
これらの方法は、細かい制御と引き換えに手軽さを得る。VS CodeとExcelは列の扱いを代わりに決め、その既定値はフラットなデータにはたいてい問題なく、ネストしたデータにはときどき意外な結果になる。出力が間違って見えたら、診断はほかの場所と同じである。ネストした値がフラット化されたか、JSONテキストのまま残ったかを確認し、開くときの区切り文字を確認する。一度だけ変換するファイルなら、どちらも新しく何かをインストールするより勝る。毎週変換するファイルなら、自分が所有するスクリプトがどちらにも勝る。スクリプトは拡張機能の版や、繰り返しクリックしなければならないダイアログに依存しないからである。
方法6について、もう一つ正直な注意点がある。ExcelとVS Codeはローカルだが、最小限ではない。独自の設定を持つ大きなプログラムであり、設定が結果を変えることがある。たとえば、カンマではなくセミコロンを期待するロケールである。2台のパソコンで出力が違ったら、データを責める前にツールの設定を確認しよう。スクリプトにはこの問題がない。スクリプトそのものが設定だからである。
並べて比較:状況別にどの方法を選ぶか
6つの方法をすべて試したあと、選択は短い判断リストになる。一度だけのファイルで、インストールするものがなく、プライバシーが重要なら、変換ページ。フラットなファイルで、ターミナルに住んでいて、1つのコマンドが欲しいなら、jq。フラットでもネストでも、すでにPythonを使っていて、繰り返す可能性があるなら、pandasを使ったPython。パッケージが許されず、同僚も走らせなければならないなら、ネストしたデータ用のフラット化ヘルパーを付けたPython標準ライブラリ。プロジェクトやビルド手順の中での変換なら、Nodeスクリプト。すでにファイルを編集中か、すでに表計算ソフトの中にいるなら、VS CodeかExcel。
常に持ち上がる2つの状況には、直接答える価値がある。機密データで、ファイルが自分のパソコンに置いたままでなければならない場合、このページのどの方法も当てはまるが、自分で読んだ短いスクリプトが最も強い選択肢である。隠れたものに信頼を置く部分がないからである。機密データで走らせる前にスクリプトを読み、元のJSONを残し、ファイルをアップロードするツールよりもページかスクリプトを選ぼう。毎週のエクスポートで、同じ形が繰り返し届く場合、pandasを使ったPythonかNodeのスクリプトを選ぼう。同じコマンドなら毎回同じ列が得られ、スクリプトは予定実行もできる。
そして、このページのどの方法も正しい答えにならない2つの状況がある。数人が同じ設定で同じ変換を必要とする場合、ばらばらになっていく5つのスクリプトのコピーよりも、共有されたページが勝る。メモリより大きなファイルの場合、ここのどの方法も苦しく、修正方法はファイルを分割するか、行ごとストリーミングすることであり、それは変換とは別の作業である。その限界を名指しすることは、比較の欠落ではなく比較の一部である。
どの方法でも失われるもの、そして原本を残す理由
このページのどの方法も同じ情報を失う。失われるのはツールではなく、形式の変更そのものによるものだからである。型はテキストになる。数値、真偽値、nullはすべてセルの中の文字になり、表計算ソフトは開くときにそれらを解釈し直すことがある。ネストしたオブジェクトはドット記法の列か結合されたセルになり、リストは選んだ方法に応じて結合されたテキストか追加の行になる。CSVだけから元の木構造に戻る方法はない。CSVは、どの列がネストしていたか、どのセルがリストだったか、どの値が数値だったかを記録していないからである。
だから、ローカル変換の最初の規則は、元のJSONを残すことである。元のファイルを上書きしてその場で変換してはいけない。たとえばorders-2026-10-26.csvのように、並び順が分かる名前を出力に付け、JSONをそばに残そう。CSVが間違っていたら、すでに情報を失ったファイルを直すのではなく、JSONから作り直す。この規則はコストがなく、元に戻せない唯一の失敗を防ぐ。
2番目の規則は、行数を数えることである。CSVは、JSONのオブジェクト1つにつきヘッダー行1行にデータ行1行を持つべきであり、素早い数え方で最も多い失敗、つまり行の検出が包まれた応答から間違ったリストを選ぶ失敗をつかまえる。数が合わなければ、ツールをリストそのものに向け直すか、まず応答の包みを解いてから、どの行も信じることにする。
6つの方法に共通するトラブルシューティング
同じ4つの問題がどの方法でも現れ、それぞれに1つの修正方法がある。1列だけの開き方は、データが壊れたのではなく、開く側の区切り文字の不一致である。取り込み直して、ファイルが書かれたときの区切り文字を選ぶ。セルに読めないreprやJSONテキストとしてネストしたデータが現れるのは、フラット化が省かれたということである。素のPythonスクリプトとjqのワンライナーはフラット化しないので、pandas版か、Nodeスクリプトか、フラット化の切り替えを入れたページを使う。
ファイルと列の順序が違うのは、ツールがキーを並び替えたということである。jqにはkeys_unsortedが必要であり、Nodeスクリプトは最初に現れた順序を保つ。行がまるごと欠けているのは、行の検出が意図したものとは別のリストを選んだということであり、包まれたAPI応答で起きる。変換ページには行の検出手順があり、スクリプトではリストを明示的に渡す必要がある。ファイルが見つからないのは、ターミナルがファイルとは別のフォルダにいるということである。ほかの何よりもまずパスを確認する。JSONが無効なのは、報告された位置の近くで元のファイルが壊れているということであり、たいていは引用符の欠落か末尾のカンマである。検証して元を直す。壊れた入力を推測すべき変換ツールはない。
関連ガイド
- JSONをローカルでCSVに変換する方法:ファイルを自分のパソコンに置いたまま変換する(2026年ガイド)
- json to csv converter download:実際にダウンロードすべきもの(2026年ガイド)
- JSONをフラット化してCSVに変換する方法:トグルが実際にやっていること(2026年ガイド)
- CSVがExcelで1列にまとまって開く原因と直し方(2026年ガイド)
- CSVがExcelで文字化けする原因と文字コードの直し方(2026年ガイド)
- CSVのコードの先頭の0がExcelで消える理由と、残す方法(2026年ガイド)
- CSVの日付がExcelで変わる原因と直し方(2026年ガイド)
- ExcelでCSVを保存すると内容が変わる理由と、元のファイルを守る方法(2026年ガイド)
- CSVが大きすぎてExcelで開けない原因と対処法(2026年ガイド)
よくある質問
JSONをローカルでCSVに変換する方法とは何か?
6つの方法がある。ブラウザのタブで動くクライアントサイドの変換ページ、標準ライブラリだけを使ったPythonスクリプト、pandasのjson_normalizeを使ったPython、ターミナルで使うjqのワンライナー、ドット記法でフラット化するヘルパー付きの小さなNodeスクリプト、そしてすでに持っているツール、つまりVS Codeの拡張機能かExcelのPower Queryである。6つすべてがファイルを自分のパソコンに置いたままにする。
一度だけのファイルには、どのローカルな方法が最適か?
変換ページである。JSONを貼り付けるかアップロードし、タブの中で変換し、CSVをダウンロードする。何もインストールしない。ローカルであることは、ネットワークを切ってから変換することでも確かめられる。それでも動く。変換はブラウザの中で走るからである。
ネストしたJSONを最もよく扱えるローカルな方法はどれか?
pandasのjson_normalizeを使ったPython、ドット記法でフラット化するヘルパー付きのNodeスクリプト、フラット化の切り替えを入れた変換ページのいずれかである。3つともネストしたオブジェクトをcustomer.nameのようなドット記法の列に変える。素のPythonスクリプトはネストした値をreprテキストのまま残し、素のjqワンライナーは間違った表を作るのではなく、ネストしたデータで失敗する。
JSONをローカルでCSVに変換するために、何かをインストールする必要があるか?
変換ページや、VS CodeやExcelのようにすでに持っているツールを使うなら、必要ない。Python 3はたいていの開発者のパソコンにすでに入っており、その標準ライブラリだけでもフラットなデータを扱える。pandas、jq、Nodeはそれぞれ一度のインストールで済み、入ってしまえばすべて完全にオフラインで動く。
ローカルのCSVが1列だけで開くのはなぜか?
データが壊れたのではなく、開く側の区切り文字の不一致である。表計算ソフトは、ファイルが書かれたときとは別の区切り文字で分割した。ファイルを取り込み直して、一致する区切り文字を選べば、列が現れる。
ネストした値がCSVの中で変なテキストとして現れるのはなぜか?
フラット化が省かれたからである。素のPython標準ライブラリのスクリプトはネストしたオブジェクトをPythonのreprテキストとして書き、pandasは結合しない限りリストをreprテキストのまま残す。オブジェクトにはpandasのjson_normalizeを使い、短いリストには結合を加えるか、Nodeスクリプトを使うか、フラット化を入れた変換ページを使う。
ローカルで変換すると情報は失われるか?
はい、どの変換でも失われるのと同じ情報が失われる。値は保たれるが、型はテキストになり、ネストしたオブジェクトはドット記法の列になり、リストは結合されたセルか追加の行になる。CSVだけから元の木構造に戻る方法はないので、元のJSONファイルは必ず残すこと。
方法を選んで今すぐ変換しよう
最も速いローカルな方法から始めよう。どんなJSONでもこのページの変換ツールに貼り付けると、ブラウザのタブの中で変換される。アップロードなし、登録なし、何も自分のパソコンを離れない。または、Python、jq、Nodeの版をコピーして、自分のファイルで走らせよう。
JSONからCSVへの変換ツールを開く