CSVとJSON — 違いと相互変換のポイント

CSVJSON は、どちらもテキストでデータを表す定番の形式ですが、得意分野がまったく違います。CSV は行と列の表(2次元)を表すのに向き、JSON はネスト(入れ子)や型を持つ構造化データを表すのに向きます。本記事では両者の仕組みの違い、相互変換でつまずきやすい点、文字コードや区切り文字、そして用途別の使い分けを正確に整理します。

結論を先に:1行1レコードのフラットな表なら CSV、配列やネスト・型の区別が必要な構造データなら JSON。CSV→JSON は「ヘッダー行をキーにする」だけで素直に行えますが、JSON→CSV はネストの平坦化という難所があります。

1. CSV とは — 行と列・区切り・RFC 4180

CSV(Comma-Separated Values)は、1行を1レコード、各列をカンマ(,)で区切って表す、2次元の表形式です。多くの場合、先頭行を列名(ヘッダー)として使います。仕様は RFC 4180 で一応の標準化がされていますが、実際には方言が多い点に注意が必要です。

id,name,age
1,Alice,30
2,Bob,25

クオートとエスケープ

値そのものに区切り文字・改行・ダブルクオートが含まれると、単純なカンマ区切りでは壊れてしまいます。RFC 4180 では、こうした値全体をダブルクオート(")で囲むことで「これで1つの値」と示します。さらに、囲んだ値の中にダブルクオートを書くときは二重("")にしてエスケープします。

id,note
1,"Tokyo, Japan"
2,"She said ""hi"""
3,"line1
line2"
CSV は「ただのカンマ区切り」ではありません。カンマ・改行・引用符を含む値があるため、正しく読み書きするにはクオート規則を守ったパーサが必要です。自前で split(",") するだけの処理は、これらの値で簡単に壊れます。

2. JSON とは — 構造化・ネスト可・型あり

JSON(JavaScript Object Notation)は、オブジェクト(キーと値の集合 { })と配列(順序付きリスト [ ])を入れ子にして、構造のあるデータを表すテキスト形式です。CSV と違い、値が型を持つのが大きな特徴です。

{
  "id": 1,
  "name": "Alice",
  "age": 30,
  "active": true,
  "address": { "city": "Tokyo", "zip": "100-0001" },
  "tags": ["admin", "staff"]
}

このように JSON は、CSV では1セルに収まらない階層・配列・型を自然に表現できます。Web API のレスポンスやアプリの設定ファイルで広く使われるのは、この表現力のためです。

3. 比較表 — 可読性・ネスト・型・サイズ・用途

両者の特徴を一覧で整理します。どちらが優れているかではなく、データの形に合うかで選ぶのが基本です。

観点CSVJSON
データ構造2次元の表(行と列)ネスト可能な階層・配列
原則すべて文字列(型なし)文字列・数値・真偽値・null を区別
可読性表データは人にも見やすい構造が深いほど読みやすい/冗長にもなる
サイズ小さい(キー名を繰り返さない)大きめ(各要素にキー名が付く)
表計算との相性そのまま開ける(Excel 等)そのままでは表に展開しにくい
主な用途表データ・一括エクスポート/インポートWeb API・設定ファイル・構造データ

同じ表データなら CSV の方がサイズは小さくなりがちです。一方、ネストや型の区別が必要なら、行と列だけの CSV では表現しきれず JSON が必要になります。

4. 相互変換の考え方 — ヘッダーをキーに/ネストの平坦化

CSV → JSON は素直

CSV を JSON に変換する基本は、ヘッダー行を各オブジェクトのキーにし、2行目以降の各行を1つのオブジェクトにして配列にまとめる、という流れです。

id,name,age
1,Alice,30

↓

[
  { "id": "1", "name": "Alice", "age": "30" }
]

ここで注意したいのがです。CSV の値は本来すべて文字列なので、上の "30" のように数値も文字列として読み込まれるのが既定の挙動です。数値や真偽値にしたい場合は、変換時に「この列は数値」と明示的に型変換する必要があります(自動推定は誤変換の原因にもなります)。

JSON → CSV は平坦化が難所

逆向きは一筋縄ではいきません。JSON はネストや配列を持てますが、CSV は2次元の表なので、階層をどう列に落とすか(平坦化)を決める必要があります。代表的な論点は次の2つです。

{ "id": 1, "address": { "city": "Tokyo" }, "tags": ["a","b"] }

↓(平坦化の一例)

id,address.city,tags
1,Tokyo,"[""a"",""b""]"
変換の往復で情報が失われないか確認を。JSON→CSV→JSON と往復すると、型(文字列化)やネスト構造、キーの欠損が崩れることがあります。平坦化の規則を決めたら、元に戻せるか(ラウンドトリップ)を必ずテストしましょう。

5. 文字コード・BOM・区切り(TSV/セミコロン)

CSV は仕様が緩い分、文字コードと区切り文字でのトラブルが起きやすい形式です。一方 JSON は標準で UTF-8 が前提なので、この種の問題は起きにくくなります。

6. 使い分け — 表計算/設定/API

最後に、現場での選び方を用途別にまとめます。

迷ったら、「1枚の表に収まるか?」を基準にしてください。収まるなら CSV、ネストや配列・型の区別が要るなら JSON、と考えれば大きく外しません。

Free Tool CSV ⇄ JSON 変換ツールで試す ブラウザ内で CSV と JSON を相互変換できます。ヘッダーをキーにした変換や、結果のコピーに対応しています。

よくある質問(FAQ)

CSVとJSONはどちらを使うべきですか?

扱うデータの形に合わせて選びます。1行1レコードの単純な表データや、表計算ソフトとのやり取り、巨大なデータの一括処理には CSV が向きます。一方、ネスト(入れ子)や配列、文字列・数値・真偽値・null といった型を区別したいデータ、Web API でのやり取りには JSON が向きます。フラットな表は CSV、構造のあるデータは JSON、と覚えておくと迷いません。

CSVのクオート(引用符)とは何ですか?

値の中に区切り文字(カンマ)、改行、ダブルクオートそのものが含まれるとき、その値全体をダブルクオートで囲んで「これは1つの値だ」と示す仕組みです。RFC 4180 では、囲んだ値の中にダブルクオートを書く場合は二重にして("")エスケープします。例えば値が She said "hi" なら、CSV では "She said ""hi""" と表記します。

ネストしたデータはCSVで表せますか?

CSV は本質的に2次元の表なので、JSON のような入れ子構造をそのままは表せません。実務では、ネストしたキーを user.address.city のようにドット区切りの列名へ平坦化したり、配列を JSON 文字列のままセルに格納する、といった回避策を取ります。ただしこれらは独自ルールであり、平坦化の規則を決めて変換の往復で情報が失われないか必ず確認する必要があります。

← 技術ブログ一覧へ戻る