Json To Csv LogoJson To Csv

JSONをフラット化してCSVに変換する方法:トグルが実際にやっていること(2026年ガイド)

フラット化とは、ネストしたJSONを表計算ソフトで扱える行と列の形に直す処理です。オブジェクトはドット記法の列になり、リストは結合または文字列化され、空値は厳密なルールに従います。この記事では、トグルが実際に何をするのかをセル単位で解説し、実際のエンジンで検証しています。

更新日: 2026-10-1311 分で読めます

なぜJSONは平らにならないのか:ツリーと表の違い

CSVは表です。行と列があり、すべてのセルは単一の平らな値です。一方JSONはツリーです。オブジェクトの中にオブジェクトがあり、オブジェクトの中にリストがあり、リストの中にオブジェクトがあります。フラット化はこの2つの形のあいだの翻訳であり、JSONからCSVへの変換の中でも、変換ツールがあなたの代わりに判断を下さなければならない唯一の部分です。なぜなら、ここには唯一の「正解」が存在しないからです。

最も単純なネストしたレコードを考えてみましょう。{ \"id\": 1, \"customer\": { \"name\": \"Ana\", \"city\": \"Madrid\" } }です。表の中に「2つのものを内包するcustomer」を入れる方法はありません。つまり変換ツールは選択を迫られます。customerに独自の列を与えてオブジェクトをテキストとして詰め込むか、オブジェクトを展開してcustomer.nameとcustomer.cityという列にするかです。すべての変換ツールは、同じような一握りのルールでこの選択を下しています。そのルールを知れば、変換ボタンを押す前に自分のCSVを予測できるようになります。

この判断がツールごとに少しずつ違う理由は、用途が違うからです。表計算で集計したい人にはドット記法の列が嬉しく、システムに戻すデータを保存したい人には生のJSONテキストが嬉しいのです。フラット化のトグルは、この用途の違いを切り替えるスイッチだと考えると分かりやすくなります。ツールが勝手に決めているのではなく、用途に合わせてあなたが選べるようになっているのです。

この記事でフラット化するサンプルデータ

以下に登場する例はすべて1つのファイルで実証します。3件の注文データで、3階層のネスト、単純な値のリスト、空のリスト、空のオブジェクト、null、オブジェクトのリストを含んでいます。このファイルをこのサイトの実際の変換エンジン(変換ボタンを押したときに動くのと同じJavaScript)で実行し、表示する出力はすべてエンジンが実際に出力したものです。

注文データを選んだのには理由があります。APIのエクスポートや業務システムのJSONは、だいたいこの形をしているからです。顧客情報はネストし、注文品目はリストになり、住所の一部はnullで、配送情報はオブジェクトの配列です。身近な形でルールを覚えれば、自分のデータにそのまま当てはめられます。

orders-nested.json
[
  { "orderId": "A-101", "customer": { "name": "Ana Ruiz", "contact": { "email": "ana@example.com", "city": "Madrid" } }, "items": ["book", "pen"], "tags": [], "meta": {} },
  { "orderId": "A-102", "customer": { "name": "Ken Sato", "contact": { "email": "ken@example.com", "city": "Osaka" } }, "items": ["lamp"], "tracking": [{ "code": "TX-1", "status": "shipped" }, { "code": "TX-2", "status": "pending" }] },
  { "orderId": "A-103", "customer": { "name": "Lina Noor", "contact": { "email": null, "city": "Berlin" } }, "items": ["mug", null, "plate"] }
]

ルール1:ネストしたオブジェクトはドット記法の列になる

最初にして最も重要なルールです。オブジェクトのネストは、その階層をドットでつないだ列名になります。customer.contact.emailは3つの列ではなく、ツリーをたどる完全なパスを名前とする1つの列です。フラット化をONにしたときのエンジンの実際の出力がこちらです。

CSV output — flattening ON (verified against the real engine)
orderId,customer.name,customer.contact.email,customer.contact.city,items,tags,meta,tracking
A-101,Ana Ruiz,ana@example.com,Madrid,book; pen,,{},
A-102,Ken Sato,ken@example.com,Osaka,lamp,,,"[{""code"":""TX-1"",""status"":""shipped""},{""code"":""TX-2"",""status"":""pending""}]"
A-103,Lina Noor,,Berlin,mug; ; plate,,,

ネストの深さ自体に実質的な制限はありません。4階層のオブジェクト({ a: { b: { c: { d: \"deep\" } } } })でもテストしたところ、エンジンはa.b.c.dという名前の単一の列を生成し、値はdeepになりました。ドット付きの列名は表計算ソフトでそのままソートやフィルターができます。customer.contact.cityが長すぎると感じたら、あとでヘッダーを一括で名前変更すればよいだけです。

ルール2:単純な値のリストは1つのセルに結合される

リストの中身がすべて単純な値(文字列、数値、真偽値、null)だけの場合、リスト全体が1つのセルにまとまり、値は\"; \"(セミコロン+半角スペース)で結合されます。上のitems列を見てください。[\"book\", \"pen\"]はbook; penという単一のセルになり、[\"mug\", null, \"plate\"]はmug; ; plateになりました。nullはスキップされず、空の区切りとして残っています。

実務上の注意点は2つあります。1つ目:CSVの区切り文字にセミコロンを選んだ場合、この結合セルは自動的に引用符で囲まれます(\"book; pen\")。セル内の区切り文字がセルを分割しないよう、エンジンはセルごとにCSVの引用ルールを適用します(上のテストで検証済みです)。2つ目:結合すると境界の情報は失われます。フラット化後のbook; penはテキストであり、リストではありません。itemsを行に戻して分割したい場合はルール3をご覧ください。

ルール3:オブジェクトのリストは1つのJSONテキストセルにまとまる

このルールが一番驚かれます。リストの中身がオブジェクトの場合({ code, status }を持つtracking配列のような)は、列になれません(オブジェクトは構造を持っていて、単なる値ではないからです)し、単純な値のように結合することもできません。そこでエンジンはリスト全体を、引用符で囲んだJSONテキストのセルとして格納します。上の例では、A-102のtracking列がJSON配列全体をテキストとして保持し、CSVのルールに従ってエスケープされています。

これは制限でしょうか。正直に言えば、この形に関してはそうです。この変換ツールには行展開のトグルがありません。リストの項目ごとに行を作ることは決してありません。配送イベントごとに1行が必要な場合は、変換前に作り直してください。内側の配列を取り出して([{\"code\": \"TX-1\", \"status\": \"shipped\"}, ...]だけを単独で変換すれば)、codeとstatusのきれいな行が得られます。1列のJSONテキストは、頼んでもいない行を勝手に作り出すより誠実な選択肢です。

実務のヒントを1つ。オブジェクトのリストを項目ごとに行にしたい作業が頻繁にあるなら、変換の前に軽く整形する癖をつけると楽になります。たとえばPythonのjsonモジュールやjqコマンドで内側の配列だけを取り出して保存し、それを変換ツールに渡すだけです。手間は数秒で、出力はそのまま分析に使えるきれいな表になります。

ルール4:空値とnullには厳密なルールがある

「なぜCSVが変なの?」という混乱の多くはnullと空値から始まるので、検証済みの挙動を推測抜きで列挙します。

  • nullの値は空のセルになります。Lina Noorのemail: nullは、customer.contact.emailの下に空のセルを作りました。「null」という文字も引用符もありません。
  • 空のリストは空のセルになります。A-101のtags: []はセルが空白のままです。(補足:これはフラット化ONの挙動です。フラット化をOFFにすると同じリストは[]という文字通りのテキストで現れます。)
  • 空のオブジェクトは{}というテキストになります。A-101のmeta: {}は、{}を含むセルを作りました。展開するものがないため、エンジンはオブジェクトの文字通りの形を書き込みます。
  • リストの中のnullは、スキップされたり「null」と書かれたりせず、空の結合区切りになります(上のmug; ; plateの通りです)。

これらは普遍的な法則ではなく設計上の判断ですが、一貫しています。nullは「ここには何もない」という意味であり、CSVも何も書きません。

フラット化ONとOFFをバイト単位で比較

同じファイルをフラット化OFFで変換した結果です。トップレベルのキーごとに列が保たれ、ネストした構造は引用符で囲んだJSONテキストとして格納されます。

CSV output — flattening OFF (verified against the real engine)
orderId,customer,items,tags,meta,tracking
A-101,"{""name"":""Ana Ruiz"",""contact"":{""email"":""ana@example.com"",""city"":""Madrid""}}","[""book"",""pen""]",[],{},
A-102,"{""name"":""Ken Sato"",""contact"":{""email"":""ken@example.com"",""city"":""Osaka""}}","[""lamp""]",,,"[{""code"":""TX-1"",""status"":""shipped""},{""code"":""TX-2"",""status"":""pending""}]"
A-103,"{""name"":""Lina Noor"",""contact"":{""email"":null,""city"":""Berlin""}}","[""mug"",null,""plate""]",,,

OFFモードの特徴に注目してください。列はトップレベルのキー(customer、items、tags、meta、tracking)に縮小し、各ネスト値はCSVの引用符倍増ルールでエスケープされた生のJSON文字列化テキストになります。空のリストと空のオブジェクトは文字通りの[]と{}のテキストで現れます。OFFは誠実ですが見づらい表現です。ネスト構造をそのまま保つ必要がある場合(たとえば、JSON形式のフィールドを期待するシステムにデータを戻す前)に正しく使えます。分析のため(フィルター、ピボットテーブル、グラフ)にはフラット化ONが正解です。だからこそONがデフォルトになっています。

選び方の目安をまとめるとこうなります。CSVを開いて集計やグラフ作りをしたいならON。元のJSONの構造を保ったまま別のシステムに渡したいならOFF。迷ったらONで変換し、出力の列を見てから決め直すのが一番確実です。変換は何度でもやり直せるので、最初の一発で完璧を狙う必要はありません。

行はどこから来るのか:配列、APIのラッパー、JSON Lines

フラット化が列を決め、別の仕組みが行を決めます。エンジンはトップレベルの値を見て、3つのケースに従います。

ケース1:トップレベルがオブジェクトの配列の場合、各オブジェクトが1行になります。上の注文データの例です。3つのオブジェクトで3行です。ケース2:トップレベルが単一のオブジェクトの場合、1行になります。ケース3が便利です。トップレベルが配列を包むオブジェクトの場合です。APIのレスポンスに多い形({ \"data\": [ ... ], \"total\": 2 })です。エンジンは内側の配列を検出し(data、results、users、itemsといった一般的なラッパーキーを確認します)、各要素を行にして、ラッパーのフィールドは捨てます。検証済みです。{ \"data\": [{ \"a\": 1, \"b\": 2 }, { \"a\": 3, \"b\": 4 }], \"total\": 2 }は、aとbの列を持つ2つのデータ行だけを生成し、totalは消えました。

もう1つ知っておきたい入力形式があります。エンジンはJSON Lines(NDJSON)も受け付けます。1行に1つのJSONオブジェクトです。エクスポートが1つの大きな配列ではなく1万行のテキストの場合、そのまま貼り付けてください。同じように変換されます。

1行ずつ変換できることの実用的な意味は、巨大ファイルの扱いやすさです。配列が1つだと全体をメモリに載せる必要がありますが、JSON Linesなら行ごとに処理できます。ログやイベントストリームのエクスポートはこの形式が多いので、そのまま渡せるのは地味に便利な点です。

不揃いなデータ:欠けたキーは空セルになるだけ

実際のエクスポートは不揃いです。注文A-102にはtrackingがありますがmetaがなく、A-101にはmetaがありますがtrackingがなく、A-103にはどちらもありません。エンジンは、すべての行で見つかったキーの和集合を順番に列リストとして作ります。上のヘッダー行が8列すべてを持つのはそのためです。キーが欠けた行は、その下が単に空のセルになります。

ヘッダーがアルファベット順ではなく挿入順(orderIdが先、続いて最初に見つかったネストキー)で出る理由もここにあります。列はエンジンがデータをたどった順に従います。後の行で新しいネストパスが現れても、その列は追加されます。何かが黙って捨てられることはありません。

列が思ったより増えてしまったときの対処法も覚えておきましょう。フラット化はまず全部展開し、あとで表計算ソフト側で不要な列を削除するのが一番手っ取り早いやり方です。変換の時点で列を絞ろうとすると、データの取りこぼしにつながりやすくなります。展開は多めに、整理はあとから、が安全です。

つまずきやすい3つのエッジケース

1つ目:ドットを含むキーです。JSONにリテラルのキー\"user.name\"と、ネストしたuser: { name: ... }の両方がある場合、両方が同じ列を欲しがります。テストしました。ネストした値が勝ち、リテラルキーの値は失われます([{ \"user.name\": \"x\", user: { name: \"y\" } }]はuser.nameという1つの列を作り、中身はyになりました)。両方の値が大事なら、変換前にドット付きキーを改名してください。

2つ目:型が混ざったリストです。[1, \"a\", { \"b\": 2 }]のようなリストは「すべて単純な値」ではないため、エンジンはオブジェクトのリストと同様に扱い、全体を1つのJSONテキストセルに文字列化します。ほとんどが単純な値でもです。「; 」で結合する挙動が欲しいなら、リストを同種の値で揃えてください。

3つ目:深いネストは問題ありませんが、列名には注意です。10階層のネストは10つの部分からなるドット付き列名を生みます。技術的には正しいですが、実務的には読みにくいです。全部フラット化してから、実際に使う3つの列だけ名前を変えましょう。

30秒で確認できるフラット化チェックリスト

何も覚えられない場合のために:分析にはフラット化をONのままにし、構造の保持が必要なときだけOFFにする。ドット記法の列と「; 」で結合されたリストを期待する。オブジェクトのリストを項目ごとに行にしたいときは、変換前に取り出して単独で変換する。空のセルはnullの誠実な表現であり、エラーではない。トグルは1クリックですが、そのクリックが何をするのか、今あなたは正確に知っています。

分からなくなったら、この記事のサンプルデータで一度試してから、自分のデータを流し込むと安心です。

関連ガイド

よくある質問

JSONをフラット化してCSVにするとはどういう意味ですか?

フラット化とは、ネストしたJSONを平らな表計算の表に直す工程です。ネストしたオブジェクトはドット記法の列になり(customer.contact.city)、単純な値のリストは「; 」で1つのセルに結合され、オブジェクトのリストは1つのJSONテキストセルにまとまります。フラット化しないと、ネストした値は引用符で囲んだ生のJSONテキストとして1列に格納されます。この違いが効くのは、変換後の使い道が決まっているときです。ExcelやGoogleスプレッドシートで並べ替えやフィルターを使いたいなら、ネストは必ずほぐしてください。逆に、変換後にプログラムで読み戻すだけなら、ほぐさない方が元の形を保てます。

ネストしたJSONオブジェクトをCSVの列にフラット化するにはどうすればいいですか?

フラット化オプションのある変換ツールを使ってONのままにしてください。ネストしたオブジェクトは任意の深さで自動的にドット記法の列に展開されます(customer.contact.emailや、a.b.c.dのような深いパスも)。このサイトの変換ツールではフラット化がデフォルトです。JSONを貼り付けるかファイルをアップロードして変換すれば、ネストしたパスがそれぞれソートやフィルター可能な列になります。

JSONをフラット化するとき配列はどうなりますか?

配列の中身によって変わります。単純な値(文字列、数値)のリストは「; 」で1つのセルに結合されます。[\"book\", \"pen\"]はbook; penになります。オブジェクトのリストは1つの引用符付きJSONテキストセルとして格納されます。オブジェクトは平らな値になれないからです。空のリストは空のセルになります。型が混ざったリストは全体が文字列化されるので、予測可能な結果が欲しいときはリストを同種の値で揃えてください。

フラット化したCSVに空のセルが多いのはなぜですか?

空のセルは正常で誠実です。nullの値は空のセルになり、空のリストは空のセルになり、行ごとにキーが違う不揃いなデータでは欠けたキーが空白になります。空欄が元のJSONのnullと一致しているか確認してください。一致していれば変換は正しく行われています。

JSONをCSVに変換するとき、フラット化はONとOFFのどちらがいいですか?

分析にはONのままにしてください。ドット記法の列はピボットテーブル、フィルター、グラフが求める形です。OFFにするのは、ネスト構造を正確に保つ必要があるときだけです。たとえばJSON形式のフィールドを期待するシステムにデータを戻す前です。OFFモードでは各ネスト値が引用符で囲んだ生のJSONテキストとして格納されます。正しいですが、表計算では使いにくい形です。

ネストしたオブジェクトの配列を項目ごとに行にできますか?

この変換ツールはオブジェクトのリストを行に展開しません。1つのJSONテキストセルとして格納します。確実な回避策は、内側の配列を取り出して単独で変換することです(たとえば[{\"code\":\"TX-1\"},{\"code\":\"TX-2\"}]だけを変換すれば、項目ごとのきれいな行が得られます)。変換の後にではなく、前に取り出してください。

JSONをオンラインで無料でフラット化してCSVにするツールはありますか?

はい。このサイトの変換ツールは無料で、登録不要で、ネストしたJSONをデフォルトでフラット化します(ドット記法の列、「; 」で結合されたリスト)。変換はすべてブラウザ内で行われるため、データがデバイスから外に出ることはありません。ファイルをアップロードするかJSONを貼り付けて、フラット化をONのままにし、区切り文字を選んで、CSVをダウンロードしてください。

ネストしたJSONがありますか?今すぐフラット化しましょう。インストール不要です

ネストしたJSONを貼り付けるかファイルをアップロードしてください。オブジェクトはドット記法の列になり、リストはきれいに結合され、変換はすべてブラウザ内で実行されます。無料、登録不要です。

JSONからCSVへの変換ツールを開く
ガイド一覧